@lucern/graph-primitives 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/beliefEvidenceLinks.js.map +1 -1
  2. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  3. package/dist/contradictions.js +5 -5
  4. package/dist/contradictions.js.map +1 -1
  5. package/dist/entityBridge.js +2 -1
  6. package/dist/entityBridge.js.map +1 -1
  7. package/dist/entityLifecycle.js.map +1 -1
  8. package/dist/epistemicAnswers.js +1 -1
  9. package/dist/epistemicAnswers.js.map +1 -1
  10. package/dist/epistemicBeliefs.admin.js +2 -2
  11. package/dist/epistemicBeliefs.admin.js.map +1 -1
  12. package/dist/epistemicBeliefs.backfills.js +9 -5
  13. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  14. package/dist/epistemicBeliefs.confidence.js +3 -5
  15. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  16. package/dist/epistemicBeliefs.core.js +20 -30
  17. package/dist/epistemicBeliefs.core.js.map +1 -1
  18. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  19. package/dist/epistemicBeliefs.helpers.js +1 -1
  20. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  21. package/dist/epistemicBeliefs.internal.js +15 -25
  22. package/dist/epistemicBeliefs.internal.js.map +1 -1
  23. package/dist/epistemicBeliefs.js +33 -43
  24. package/dist/epistemicBeliefs.js.map +1 -1
  25. package/dist/epistemicBeliefs.lifecycle.js +3 -5
  26. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  27. package/dist/epistemicBeliefs.links.js +1 -1
  28. package/dist/epistemicBeliefs.links.js.map +1 -1
  29. package/dist/epistemicBeliefs.queries.js.map +1 -1
  30. package/dist/epistemicBeliefs.topicAnchor.js +12 -22
  31. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  32. package/dist/epistemicContracts.evaluators.js +3 -5
  33. package/dist/epistemicContracts.evaluators.js.map +1 -1
  34. package/dist/epistemicContracts.handlers.js +3 -6
  35. package/dist/epistemicContracts.handlers.js.map +1 -1
  36. package/dist/epistemicContracts.js +3 -6
  37. package/dist/epistemicContracts.js.map +1 -1
  38. package/dist/epistemicEdgeCreation.js.map +1 -1
  39. package/dist/epistemicEdges.handlers.js.map +1 -1
  40. package/dist/epistemicEdges.js +6 -7
  41. package/dist/epistemicEdges.js.map +1 -1
  42. package/dist/epistemicEdges.mutations.js +3 -4
  43. package/dist/epistemicEdges.mutations.js.map +1 -1
  44. package/dist/epistemicEdges.queries.js +3 -3
  45. package/dist/epistemicEdges.queries.js.map +1 -1
  46. package/dist/epistemicEvidence.js +10 -10
  47. package/dist/epistemicEvidence.js.map +1 -1
  48. package/dist/epistemicEvidenceHelpers.js +1 -1
  49. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  50. package/dist/epistemicEvidenceMutations.js +5 -5
  51. package/dist/epistemicEvidenceMutations.js.map +1 -1
  52. package/dist/epistemicEvidenceQueries.js +6 -6
  53. package/dist/epistemicEvidenceQueries.js.map +1 -1
  54. package/dist/epistemicHelpers.js +4 -4
  55. package/dist/epistemicHelpers.js.map +1 -1
  56. package/dist/epistemicInsert.js.map +1 -1
  57. package/dist/epistemicLayerRules.js +2 -2
  58. package/dist/epistemicLayerRules.js.map +1 -1
  59. package/dist/epistemicLinking.js.map +1 -1
  60. package/dist/epistemicNodeCreation.js +2 -2
  61. package/dist/epistemicNodeCreation.js.map +1 -1
  62. package/dist/epistemicNodes.internal.js +2 -3
  63. package/dist/epistemicNodes.internal.js.map +1 -1
  64. package/dist/epistemicNodes.js +10 -12
  65. package/dist/epistemicNodes.js.map +1 -1
  66. package/dist/epistemicNodes.mutations.js +3 -4
  67. package/dist/epistemicNodes.mutations.js.map +1 -1
  68. package/dist/epistemicNodes.queries.js +5 -5
  69. package/dist/epistemicNodes.queries.js.map +1 -1
  70. package/dist/epistemicQuestions.conviction.js +5 -5
  71. package/dist/epistemicQuestions.conviction.js.map +1 -1
  72. package/dist/epistemicQuestions.create.js +7 -7
  73. package/dist/epistemicQuestions.create.js.map +1 -1
  74. package/dist/epistemicQuestions.evidence.js +2 -2
  75. package/dist/epistemicQuestions.evidence.js.map +1 -1
  76. package/dist/epistemicQuestions.helpers.js +7 -4
  77. package/dist/epistemicQuestions.helpers.js.map +1 -1
  78. package/dist/epistemicQuestions.js +16 -13
  79. package/dist/epistemicQuestions.js.map +1 -1
  80. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  81. package/dist/epistemicQuestions.queries.js +2 -2
  82. package/dist/epistemicQuestions.queries.js.map +1 -1
  83. package/dist/epistemicQuestions.sprint.js +6 -3
  84. package/dist/epistemicQuestions.sprint.js.map +1 -1
  85. package/dist/epistemicQuestions.tail.js +2 -2
  86. package/dist/epistemicQuestions.tail.js.map +1 -1
  87. package/dist/epistemicSources.js.map +1 -1
  88. package/dist/index.js +88 -98
  89. package/dist/index.js.map +1 -1
  90. package/dist/proof-attestation.json +1 -1
  91. package/dist/questionEvidenceLinks.js +3 -2
  92. package/dist/questionEvidenceLinks.js.map +1 -1
  93. package/package.json +4 -4
@@ -725,7 +725,7 @@ function normalizeQuestionTopicId(topicId) {
725
725
  return typeof topicId === "string" && topicId.trim().length > 0 ? topicId : void 0;
726
726
  }
727
727
  async function resolveQuestionScopeOrNull(ctx, args) {
728
- if (!(args.projectId || args.topicId)) {
728
+ if (!args.topicId) {
729
729
  return null;
730
730
  }
731
731
  try {
@@ -814,7 +814,7 @@ function readBeliefNodeRow(value) {
814
814
  return id && globalId && nodeType ? { _id: id, globalId, nodeType } : null;
815
815
  }
816
816
  function resolveCanonicalEdgeTopicId(args) {
817
- return normalizeQuestionTopicId(args.topicId) ?? args.projectId;
817
+ return normalizeQuestionTopicId(args.topicId);
818
818
  }
819
819
  var createEvidenceFromScoredQuestion = internalMutation({
820
820
  args: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/epistemicInsert.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicQuestions.helpers.ts","../src/epistemicQuestions.evidence.ts"],"names":["isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD","query","readStringArray","v"],"mappings":"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","file":"epistemicQuestions.evidence.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","interface GraphPrimitiveDebugEnvironment {\n process?: {\n env?: Record<string, string | undefined>;\n };\n}\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" || env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the `globalId` of an EXISTING `epistemicNodes` row, not\n * that it has a v7 shape. Refuses doc-ids and fabricated/unknown endpoints while\n * keeping legacy v4-`globalId` nodes (the established prod corpus) linkable.\n * SHAPE pre-filter accepts both v4 and v7; the indexed `by_globalId` lookup is\n * the referential authority (no full scan). v7-format stays enforced only at new\n * identity minting (`assertUuidV7Identity`). See c2-rr4b-endpoint-referential.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses the mixed _id/globalId endpoint writes at the floor while\n // keeping legacy v4-globalId nodes linkable (RR.4b prod-incident cure).\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport type {\n DatabaseReader,\n DatabaseWriter,\n Id,\n MutationCtx,\n QueryCtx,\n} from \"./convex\";\nimport { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ninterface LegacyProjectThesis {\n confidence: number;\n lastUpdated: number;\n statement: string;\n}\n\ntype LegacyPillarImportance = \"critical\" | \"major\" | \"minor\" | \"not_applicable\";\n\ninterface LegacyThesisPillarConfig {\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n configuredAt?: number;\n configuredBy?: string;\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n}\n\ninterface LegacyBeliefArchitecture {\n lastCalculated: number;\n overallMaturity: number;\n pillarScores: Record<string, unknown>[];\n}\n\ninterface LegacyOntologyClassification {\n classifiedAt: number;\n functions: Record<string, unknown>[];\n overallConfidence: number;\n valueChains: Record<string, unknown>[];\n}\n\ntype TopicDocLike = Record<string, unknown> & {\n _id: string;\n _creationTime?: number;\n globalId?: string;\n name?: string;\n description?: string;\n type?: string;\n tenantId?: string;\n workspaceId?: string;\n status?: string;\n visibility?: string;\n createdBy?: string;\n /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\ninterface OverlayContext {\n db?: Pick<DatabaseReader, \"get\" | \"query\"> &\n Partial<Pick<DatabaseWriter, \"patch\">>;\n runMutation?: MutationCtx[\"runMutation\"];\n runQuery?: QueryCtx[\"runQuery\"];\n}\n\ninterface TopicPatchPlan {\n nextMetadata: Record<string, unknown>;\n patch: Record<string, unknown>;\n topicUpdateArgs: Record<string, unknown> & { id: string };\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readNonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n}\n\nfunction readMetadata(topic: TopicDocLike): Record<string, unknown> {\n return topic.metadata && typeof topic.metadata === \"object\"\n ? topic.metadata\n : {};\n}\n\nfunction omitMetadataKey(\n metadata: Record<string, unknown>,\n key: string\n): Record<string, unknown> {\n const { [key]: _omitted, ...rest } = metadata;\n return rest;\n}\n\nfunction readLegacyProjectId(\n value: Record<string, unknown> | null | undefined\n): string | undefined {\n if (!value) {\n return;\n }\n return readNonEmptyString(value[LEGACY_SCOPE_FIELD]);\n}\n\nfunction coerceVisibility(\n value: unknown\n): TopicProjectOverlay[\"visibility\"] | undefined {\n return value === \"private\" ||\n value === \"team\" ||\n value === \"firm\" ||\n value === \"external\" ||\n value === \"public\"\n ? value\n : undefined;\n}\n\nfunction coerceStatus(\n value: unknown\n): TopicProjectOverlay[\"status\"] | undefined {\n return value === \"active\" || value === \"archived\" || value === \"watching\"\n ? value\n : undefined;\n}\n\nfunction mapProjectType(\n topic: TopicDocLike,\n metadata: Record<string, unknown>\n): string {\n const explicit = readNonEmptyString(metadata.projectType);\n if (explicit) {\n return explicit;\n }\n if (topic.type === \"theme\") {\n return \"thematic\";\n }\n return readNonEmptyString(topic.type) || \"general\";\n}\n\nfunction isProjectLikeTopic(topic: TopicDocLike): boolean {\n const metadata = readMetadata(topic);\n return (\n topic.type === \"theme\" ||\n topic.type === \"thematic\" ||\n topic.type === \"deal\" ||\n topic.type === \"monitoring\" ||\n readLegacyProjectId(topic) !== undefined ||\n readNonEmptyString(metadata.projectType) !== undefined\n );\n}\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: OverlayContext,\n scopeId: string\n): Promise<TopicDocLike | null> {\n if (ctx?.db && typeof ctx.db.get === \"function\") {\n try {\n const directTopic = (await ctx.db.get(\n scopeId as Id<\"topics\">\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n }\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(api.topics.get, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n }\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(\n api.topics.getByLegacyScopeId,\n {\n projectId: String(scopeId),\n }\n );\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId }\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\"\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n let createdAt = 0;\n if (typeof topic.createdAt === \"number\") {\n createdAt = topic.createdAt;\n } else if (typeof topic._creationTime === \"number\") {\n createdAt = topic._creationTime;\n }\n let updatedAt = createdAt;\n if (typeof topic.updatedAt === \"number\") {\n updatedAt = topic.updatedAt;\n } else if (typeof metadata.updatedAt === \"number\") {\n updatedAt = metadata.updatedAt;\n }\n\n return {\n ...metadata,\n _id: outwardId,\n projectId: outwardId,\n topicId,\n storageProjectId,\n legacyProjectId,\n name: readNonEmptyString(topic.name) || \"Untitled Theme\",\n type: mapProjectType(topic, metadata),\n description: readNonEmptyString(topic.description),\n ownerId:\n readNonEmptyString(metadata.ownerId) ||\n readNonEmptyString(topic.createdBy) ||\n \"system\",\n // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n // RR.1 carrier: preserve the nested metadata carrier so the kernel's\n // `checkProjectAccessDetailed` metadata-PRIMARY read\n // (`project.metadata?.ownerPrincipalId`) resolves the grant. The `...metadata`\n // spread above only flattens keys; it does not leave a nested `metadata`.\n metadata,\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n if (options.projectLikeOnly !== false && !isProjectLikeTopic(topic)) {\n return null;\n }\n return materializeTopicProjectOverlay(topic, options.idMode);\n}\n\nexport async function listTopicProjectOverlays(\n ctx: OverlayContext,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay[]> {\n let allTopics: TopicDocLike[] = [];\n\n if (ctx?.db?.query && typeof ctx.db.query === \"function\") {\n try {\n allTopics = (await ctx.db.query(\"topics\").collect()) as TopicDocLike[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error }\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list, {})) ?? []) as TopicDocLike[]) ||\n [];\n }\n\n return allTopics\n .filter(\n (topic) => options.projectLikeOnly === false || isProjectLikeTopic(topic)\n )\n .map((topic) => materializeTopicProjectOverlay(topic, options.idMode));\n}\n\nexport async function patchTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n value: Record<string, unknown>\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n\n const plan = buildTopicProjectOverlayPatchPlan(topic, value);\n await applyTopicProjectOverlayPatch(ctx, topic, plan);\n\n return materializeTopicProjectOverlay({\n ...topic,\n ...plan.patch,\n metadata: plan.nextMetadata,\n } as TopicDocLike);\n}\n\nfunction buildTopicProjectOverlayPatchPlan(\n topic: TopicDocLike,\n value: Record<string, unknown>\n): TopicPatchPlan {\n const plan: TopicPatchPlan = {\n nextMetadata: { ...readMetadata(topic) },\n patch: {},\n topicUpdateArgs: {\n id: String(topic._id),\n },\n };\n for (const [key, rawValue] of Object.entries(value)) {\n applyTopicProjectOverlayPatchEntry(plan, key, rawValue);\n }\n\n plan.patch.updatedAt = Date.now();\n plan.patch.metadata = plan.nextMetadata;\n plan.topicUpdateArgs.metadata = plan.nextMetadata;\n\n return plan;\n}\n\nfunction applyTopicProjectOverlayPatchEntry(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n case \"updatedAt\":\n case \"createdAt\":\n return;\n case \"name\":\n case \"description\":\n plan.patch[key] = rawValue;\n plan.topicUpdateArgs[key] = rawValue;\n return;\n case \"tenantId\":\n case \"workspaceId\":\n case \"ownerId\":\n throw new Error(\n `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`\n );\n case \"status\":\n applyTopicStatusPatch(plan, rawValue);\n return;\n case \"visibility\":\n applyTopicVisibilityPatch(plan, rawValue);\n return;\n case \"type\":\n applyTopicProjectTypePatch(plan, rawValue);\n return;\n default:\n applyTopicMetadataPatch(plan, key, rawValue);\n }\n}\n\nfunction applyTopicStatusPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const status = coerceStatus(rawValue);\n if (status) {\n plan.patch.status = status;\n plan.topicUpdateArgs.status = status;\n }\n}\n\nfunction applyTopicVisibilityPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n plan.patch.visibility = visibility;\n plan.topicUpdateArgs.visibility = visibility;\n }\n}\n\nfunction applyTopicProjectTypePatch(plan: TopicPatchPlan, rawValue: unknown) {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n plan.nextMetadata.projectType = projectType;\n return;\n }\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, \"projectType\");\n}\n\nfunction applyTopicMetadataPatch(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n if (rawValue === undefined) {\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);\n return;\n }\n plan.nextMetadata[key] = rawValue;\n}\n\nasync function applyTopicProjectOverlayPatch(\n ctx: OverlayContext,\n topic: TopicDocLike,\n plan: TopicPatchPlan\n): Promise<void> {\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);\n } catch (error) {\n if (!canPatchTopicViaLocalDb(ctx, error)) {\n throw error;\n }\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n}\n\nfunction canPatchTopicViaLocalDb(\n ctx: OverlayContext,\n error: unknown\n): ctx is {\n db: Pick<DatabaseReader, \"get\" | \"query\"> & Pick<DatabaseWriter, \"patch\">;\n} {\n return (\n isMissingLucernChildComponentError(error) &&\n Boolean(ctx?.db) &&\n typeof ctx.db?.patch === \"function\"\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n }\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\n\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !(\n isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError(error)\n )\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n }\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\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 type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\nexport interface EpistemicIndexBuilder {\n eq(field: string, value: unknown): EpistemicIndexBuilder;\n}\n\nexport interface EpistemicTableQuery<T> {\n collect(): Promise<T[]>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): EpistemicTableQuery<T>;\n take(limit: number): Promise<T[]>;\n withIndex(\n indexName: string,\n builder: (q: EpistemicIndexBuilder) => EpistemicIndexBuilder\n ): EpistemicTableQuery<T>;\n}\n\nexport interface EpistemicMutationSpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: MutationCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicQuerySpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: QueryCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicDbReader {\n get<TableName extends string>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends string>(\n table: TableName\n ): EpistemicTableQuery<Doc<TableName>>;\n}\n\nexport const defineEpistemicMutation = mutation as unknown as <Args>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof mutation>;\n\nexport const defineEpistemicQuery = query as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof query>;\n\nexport const defineEpistemicInternalMutation = internalMutation as unknown as <\n Args,\n>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof internalMutation>;\n\nexport const defineEpistemicInternalQuery = internalQuery as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof internalQuery>;\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n const maxSigned32Bit = 2_147_483_647;\n const uint32Size = 4_294_967_296;\n for (let i = 0; i < content.length; i++) {\n hash = Math.imul(hash, 33) + content.charCodeAt(i);\n hash %= uint32Size;\n if (hash > maxSigned32Bit) {\n hash -= uint32Size;\n }\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nexport async function markProjectGraphDirty(\n ctx: QueryCtx | MutationCtx,\n projectId: string | undefined | null,\n topicId?: string | undefined | null\n): Promise<void> {\n const markCacheStaleByTopic =\n internal.graphAnalysisCache.markCacheStaleByTopic;\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(0, markCacheStaleByTopic, {\n topicId: normalizedTopicId,\n });\n }\n const resolvedProjectId = normalizedTopicId ?? normalizedProjectId;\n if (!resolvedProjectId) {\n return;\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n resolvedProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\nexport type ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function 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\nexport type QuestionNodeDoc = Doc<\"epistemicNodes\"> & {\n anonymizationClass?: string;\n audienceLabel?: string;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n policyTags?: string[];\n projectId?: string;\n publicationStatus?: string;\n questionType?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n};\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nexport const MAX_QUESTION_PAGE_SIZE = 1000;\nexport interface QuestionScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\nexport function 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\nexport function dedupeQuestionNodes(\n nodes: QuestionNodeDoc[]\n): 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\nexport function normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nexport function resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return (\n normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? undefined\n );\n}\n\nexport function logQuestionFallback(\n message: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n debugGraphPrimitiveFallback(message, {\n error: formatGraphPrimitiveError(error),\n ...(context ?? {}),\n });\n}\n\nexport async function resolveQuestionScopeOrNull(\n ctx: QueryCtx | MutationCtx,\n args: QuestionScopeArgs\n) {\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 (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve question scope\",\n {\n error: formatGraphPrimitiveError(error),\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getQuestionNodesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: EpistemicTableQuery<QuestionNodeDoc>) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const topicNodes = await fetchNodes(\n ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexBuilder) =>\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\nexport async function getQuestionEdgesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId || scope.projectId)\n );\n\n return await query.collect();\n}\n\nexport function 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\nexport function buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nexport function 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\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: Boolean(meta.isKeyQuestion),\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\nexport function 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\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 (\n typeof node.status === \"string\" &&\n INACTIVE_NODE_STATUSES.has(node.status)\n ) {\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 */\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\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 { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx } from \"./convex\";\nimport { internal, internalMutation } from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { insertEpistemicNode } from \"./epistemicInsert.js\";\n// =============================================================================\n// HELPERS\nimport {\n getQuestionNodesForScope,\n markProjectGraphDirty,\n normalizeQuestionTopicId,\n resolveQuestionScopeOrNull,\n} from \"./epistemicQuestions.helpers\";\nimport { generateGlobalId } from \"./globalId\";\nimport { optionalScopeArgs } from \"./topicScope\";\n\ninterface QuestionScopeArgs {\n projectId?: string;\n topicId?: string;\n}\n\ninterface CreateEvidenceFromScoredQuestionArgs extends QuestionScopeArgs {\n answerText: string;\n beliefId: string;\n conviction: number;\n questionNodeId: Id<\"epistemicNodes\">;\n questionText: string;\n rationale: string;\n relatedBeliefIds: string[];\n userId: string;\n}\n\ninterface BackfillScoredQuestionEvidenceArgs extends QuestionScopeArgs {\n dryRun?: boolean;\n userId: string;\n}\n\ninterface QuestionEvidenceNodeRow {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n globalId?: string;\n metadata: Record<string, unknown>;\n nodeType: string;\n}\n\ninterface BeliefNodeRow {\n _id: Id<\"epistemicNodes\">;\n globalId: string;\n nodeType: string;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | null {\n const normalized = readOptionalString(value);\n return normalized ? (normalized as Id<TableName>) : null;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value\n : [];\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readQuestionEvidenceNodeRow(\n value: unknown\n): QuestionEvidenceNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const nodeType = readOptionalString(record.nodeType);\n if (!(id && nodeType)) {\n return null;\n }\n\n const row: QuestionEvidenceNodeRow = {\n _id: id,\n metadata: readRecord(record.metadata) ?? {},\n nodeType,\n };\n const canonicalText = readOptionalString(record.canonicalText);\n if (canonicalText !== undefined) {\n row.canonicalText = canonicalText;\n }\n const globalId = readOptionalString(record.globalId);\n if (globalId !== undefined) {\n row.globalId = globalId;\n }\n return row;\n}\n\nfunction readBeliefNodeRow(value: unknown): BeliefNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const globalId = readOptionalString(record.globalId);\n const nodeType = readOptionalString(record.nodeType);\n return id && globalId && nodeType ? { _id: id, globalId, nodeType } : null;\n}\n\nfunction resolveCanonicalEdgeTopicId(\n args: QuestionScopeArgs\n): string | undefined {\n return normalizeQuestionTopicId(args.topicId) ?? args.projectId;\n}\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 (\n ctx: MutationCtx,\n args: CreateEvidenceFromScoredQuestionArgs\n ) => {\n const now = Date.now();\n\n // Check if evidence was already created for this question (idempotent)\n const questionNode = readQuestionEvidenceNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (!questionNode) {\n return;\n }\n if (questionNode.nodeType !== \"question\") {\n return;\n }\n if (!questionNode.globalId) {\n throw new Error(\n \"Question node missing globalId; cannot create canonical evidence provenance edge\"\n );\n }\n const qMeta = questionNode.metadata;\n if (qMeta.evidenceNodeId) {\n return; // Already created\n }\n const edgeTopicId = resolveCanonicalEdgeTopicId(args);\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 insertEpistemicNode(ctx, {\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 beliefNodeId = readConvexId<\"epistemicNodes\">(bId);\n const node = beliefNodeId\n ? readBeliefNodeRow(await ctx.db.get(beliefNodeId))\n : null;\n if (node?.nodeType === \"belief\") {\n return node;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve belief node\",\n {\n error: formatGraphPrimitiveError(error),\n beliefId: bId,\n }\n );\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: edgeTopicId,\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: edgeTopicId,\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 (\n ctx: MutationCtx,\n args: BackfillScoredQuestionEvidenceArgs\n ) => {\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 .map(readQuestionEvidenceNodeRow)\n .filter((node): node is QuestionEvidenceNodeRow => node !== null);\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;\n return (\n meta.convictionStage === \"scored\" &&\n readOptionalString(meta.answer) &&\n !meta.evidenceNodeId &&\n (readOptionalString(meta.linkedBeliefId) ||\n readOptionalString(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;\n return {\n questionId: n._id,\n questionText: n.canonicalText?.slice(0, 80),\n beliefId:\n readOptionalString(meta.linkedBeliefId) ??\n readOptionalString(meta.beliefId),\n conviction: readFiniteNumber(meta.conviction),\n hasAnswer: readOptionalString(meta.answer) !== undefined,\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;\n const beliefId =\n readOptionalString(meta.linkedBeliefId) ??\n readOptionalString(meta.beliefId);\n const answerText = readOptionalString(meta.answer);\n const conviction = readFiniteNumber(meta.conviction) ?? 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: readStringArray(meta.relatedBeliefIds),\n conviction,\n rationale: readOptionalString(meta.convictionRationale) ?? \"\",\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 */\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/epistemicInsert.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicQuestions.helpers.ts","../src/epistemicQuestions.evidence.ts"],"names":["isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD","query","readStringArray","v"],"mappings":"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","file":"epistemicQuestions.evidence.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","interface GraphPrimitiveDebugEnvironment {\n process?: {\n env?: Record<string, string | undefined>;\n };\n}\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" || env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the UUIDv7 `globalId` of an EXISTING\n * `epistemicNodes` row. Refuses doc ids, fabricated/unknown endpoints, and\n * legacy UUIDv4 `globalId`s; those must be reminted through the identity\n * backfill ledger before participating in new edge writes.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses mixed _id/globalId endpoint writes at the floor and keeps\n // legacy UUIDv4 graph rows inside the explicit remint/backfill lane.\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport type {\n DatabaseReader,\n DatabaseWriter,\n Id,\n MutationCtx,\n QueryCtx,\n} from \"./convex\";\nimport { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ninterface LegacyProjectThesis {\n confidence: number;\n lastUpdated: number;\n statement: string;\n}\n\ntype LegacyPillarImportance = \"critical\" | \"major\" | \"minor\" | \"not_applicable\";\n\ninterface LegacyThesisPillarConfig {\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n configuredAt?: number;\n configuredBy?: string;\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n}\n\ninterface LegacyBeliefArchitecture {\n lastCalculated: number;\n overallMaturity: number;\n pillarScores: Record<string, unknown>[];\n}\n\ninterface LegacyOntologyClassification {\n classifiedAt: number;\n functions: Record<string, unknown>[];\n overallConfidence: number;\n valueChains: Record<string, unknown>[];\n}\n\ntype TopicDocLike = Record<string, unknown> & {\n _id: string;\n _creationTime?: number;\n globalId?: string;\n name?: string;\n description?: string;\n type?: string;\n tenantId?: string;\n workspaceId?: string;\n status?: string;\n visibility?: string;\n createdBy?: string;\n /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\ninterface OverlayContext {\n db?: Pick<DatabaseReader, \"get\" | \"query\"> &\n Partial<Pick<DatabaseWriter, \"patch\">>;\n runMutation?: MutationCtx[\"runMutation\"];\n runQuery?: QueryCtx[\"runQuery\"];\n}\n\ninterface TopicPatchPlan {\n nextMetadata: Record<string, unknown>;\n patch: Record<string, unknown>;\n topicUpdateArgs: Record<string, unknown> & { id: string };\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readNonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n}\n\nfunction readMetadata(topic: TopicDocLike): Record<string, unknown> {\n return topic.metadata && typeof topic.metadata === \"object\"\n ? topic.metadata\n : {};\n}\n\nfunction omitMetadataKey(\n metadata: Record<string, unknown>,\n key: string\n): Record<string, unknown> {\n const { [key]: _omitted, ...rest } = metadata;\n return rest;\n}\n\nfunction readLegacyProjectId(\n value: Record<string, unknown> | null | undefined\n): string | undefined {\n if (!value) {\n return;\n }\n return readNonEmptyString(value[LEGACY_SCOPE_FIELD]);\n}\n\nfunction coerceVisibility(\n value: unknown\n): TopicProjectOverlay[\"visibility\"] | undefined {\n return value === \"private\" ||\n value === \"team\" ||\n value === \"firm\" ||\n value === \"external\" ||\n value === \"public\"\n ? value\n : undefined;\n}\n\nfunction coerceStatus(\n value: unknown\n): TopicProjectOverlay[\"status\"] | undefined {\n return value === \"active\" || value === \"archived\" || value === \"watching\"\n ? value\n : undefined;\n}\n\nfunction mapProjectType(\n topic: TopicDocLike,\n metadata: Record<string, unknown>\n): string {\n const explicit = readNonEmptyString(metadata.projectType);\n if (explicit) {\n return explicit;\n }\n if (topic.type === \"theme\") {\n return \"thematic\";\n }\n return readNonEmptyString(topic.type) || \"general\";\n}\n\nfunction isProjectLikeTopic(topic: TopicDocLike): boolean {\n const metadata = readMetadata(topic);\n return (\n topic.type === \"theme\" ||\n topic.type === \"thematic\" ||\n topic.type === \"deal\" ||\n topic.type === \"monitoring\" ||\n readLegacyProjectId(topic) !== undefined ||\n readNonEmptyString(metadata.projectType) !== undefined\n );\n}\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: OverlayContext,\n scopeId: string\n): Promise<TopicDocLike | null> {\n if (ctx?.db && typeof ctx.db.get === \"function\") {\n try {\n const directTopic = (await ctx.db.get(\n scopeId as Id<\"topics\">\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n }\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(api.topics.get, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n }\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(\n api.topics.getByLegacyScopeId,\n {\n projectId: String(scopeId),\n }\n );\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId }\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\"\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n let createdAt = 0;\n if (typeof topic.createdAt === \"number\") {\n createdAt = topic.createdAt;\n } else if (typeof topic._creationTime === \"number\") {\n createdAt = topic._creationTime;\n }\n let updatedAt = createdAt;\n if (typeof topic.updatedAt === \"number\") {\n updatedAt = topic.updatedAt;\n } else if (typeof metadata.updatedAt === \"number\") {\n updatedAt = metadata.updatedAt;\n }\n\n return {\n ...metadata,\n _id: outwardId,\n projectId: outwardId,\n topicId,\n storageProjectId,\n legacyProjectId,\n name: readNonEmptyString(topic.name) || \"Untitled Theme\",\n type: mapProjectType(topic, metadata),\n description: readNonEmptyString(topic.description),\n ownerId:\n readNonEmptyString(metadata.ownerId) ||\n readNonEmptyString(topic.createdBy) ||\n \"system\",\n // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n // RR.1 carrier: preserve the nested metadata carrier so the kernel's\n // `checkProjectAccessDetailed` metadata-PRIMARY read\n // (`project.metadata?.ownerPrincipalId`) resolves the grant. The `...metadata`\n // spread above only flattens keys; it does not leave a nested `metadata`.\n metadata,\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n if (options.projectLikeOnly !== false && !isProjectLikeTopic(topic)) {\n return null;\n }\n return materializeTopicProjectOverlay(topic, options.idMode);\n}\n\nexport async function listTopicProjectOverlays(\n ctx: OverlayContext,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay[]> {\n let allTopics: TopicDocLike[] = [];\n\n if (ctx?.db?.query && typeof ctx.db.query === \"function\") {\n try {\n allTopics = (await ctx.db.query(\"topics\").collect()) as TopicDocLike[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error }\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list, {})) ?? []) as TopicDocLike[]) ||\n [];\n }\n\n return allTopics\n .filter(\n (topic) => options.projectLikeOnly === false || isProjectLikeTopic(topic)\n )\n .map((topic) => materializeTopicProjectOverlay(topic, options.idMode));\n}\n\nexport async function patchTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n value: Record<string, unknown>\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n\n const plan = buildTopicProjectOverlayPatchPlan(topic, value);\n await applyTopicProjectOverlayPatch(ctx, topic, plan);\n\n return materializeTopicProjectOverlay({\n ...topic,\n ...plan.patch,\n metadata: plan.nextMetadata,\n } as TopicDocLike);\n}\n\nfunction buildTopicProjectOverlayPatchPlan(\n topic: TopicDocLike,\n value: Record<string, unknown>\n): TopicPatchPlan {\n const plan: TopicPatchPlan = {\n nextMetadata: { ...readMetadata(topic) },\n patch: {},\n topicUpdateArgs: {\n id: String(topic._id),\n },\n };\n for (const [key, rawValue] of Object.entries(value)) {\n applyTopicProjectOverlayPatchEntry(plan, key, rawValue);\n }\n\n plan.patch.updatedAt = Date.now();\n plan.patch.metadata = plan.nextMetadata;\n plan.topicUpdateArgs.metadata = plan.nextMetadata;\n\n return plan;\n}\n\nfunction applyTopicProjectOverlayPatchEntry(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n case \"updatedAt\":\n case \"createdAt\":\n return;\n case \"name\":\n case \"description\":\n plan.patch[key] = rawValue;\n plan.topicUpdateArgs[key] = rawValue;\n return;\n case \"tenantId\":\n case \"workspaceId\":\n case \"ownerId\":\n throw new Error(\n `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`\n );\n case \"status\":\n applyTopicStatusPatch(plan, rawValue);\n return;\n case \"visibility\":\n applyTopicVisibilityPatch(plan, rawValue);\n return;\n case \"type\":\n applyTopicProjectTypePatch(plan, rawValue);\n return;\n default:\n applyTopicMetadataPatch(plan, key, rawValue);\n }\n}\n\nfunction applyTopicStatusPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const status = coerceStatus(rawValue);\n if (status) {\n plan.patch.status = status;\n plan.topicUpdateArgs.status = status;\n }\n}\n\nfunction applyTopicVisibilityPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n plan.patch.visibility = visibility;\n plan.topicUpdateArgs.visibility = visibility;\n }\n}\n\nfunction applyTopicProjectTypePatch(plan: TopicPatchPlan, rawValue: unknown) {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n plan.nextMetadata.projectType = projectType;\n return;\n }\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, \"projectType\");\n}\n\nfunction applyTopicMetadataPatch(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n if (rawValue === undefined) {\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);\n return;\n }\n plan.nextMetadata[key] = rawValue;\n}\n\nasync function applyTopicProjectOverlayPatch(\n ctx: OverlayContext,\n topic: TopicDocLike,\n plan: TopicPatchPlan\n): Promise<void> {\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);\n } catch (error) {\n if (!canPatchTopicViaLocalDb(ctx, error)) {\n throw error;\n }\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n}\n\nfunction canPatchTopicViaLocalDb(\n ctx: OverlayContext,\n error: unknown\n): ctx is {\n db: Pick<DatabaseReader, \"get\" | \"query\"> & Pick<DatabaseWriter, \"patch\">;\n} {\n return (\n isMissingLucernChildComponentError(error) &&\n Boolean(ctx?.db) &&\n typeof ctx.db?.patch === \"function\"\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n }\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\n\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !(\n isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError(error)\n )\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n }\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\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 type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\nexport interface EpistemicIndexBuilder {\n eq(field: string, value: unknown): EpistemicIndexBuilder;\n}\n\nexport interface EpistemicTableQuery<T> {\n collect(): Promise<T[]>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): EpistemicTableQuery<T>;\n take(limit: number): Promise<T[]>;\n withIndex(\n indexName: string,\n builder: (q: EpistemicIndexBuilder) => EpistemicIndexBuilder\n ): EpistemicTableQuery<T>;\n}\n\nexport interface EpistemicMutationSpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: MutationCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicQuerySpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: QueryCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicDbReader {\n get<TableName extends string>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends string>(\n table: TableName\n ): EpistemicTableQuery<Doc<TableName>>;\n}\n\nexport const defineEpistemicMutation = mutation as unknown as <Args>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof mutation>;\n\nexport const defineEpistemicQuery = query as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof query>;\n\nexport const defineEpistemicInternalMutation = internalMutation as unknown as <\n Args,\n>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof internalMutation>;\n\nexport const defineEpistemicInternalQuery = internalQuery as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof internalQuery>;\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n const maxSigned32Bit = 2_147_483_647;\n const uint32Size = 4_294_967_296;\n for (let i = 0; i < content.length; i++) {\n hash = Math.imul(hash, 33) + content.charCodeAt(i);\n hash %= uint32Size;\n if (hash > maxSigned32Bit) {\n hash -= uint32Size;\n }\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nexport async function markProjectGraphDirty(\n ctx: QueryCtx | MutationCtx,\n projectId: string | undefined | null,\n topicId?: string | undefined | null\n): Promise<void> {\n const markCacheStaleByTopic =\n internal.graphAnalysisCache.markCacheStaleByTopic;\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(0, markCacheStaleByTopic, {\n topicId: normalizedTopicId,\n });\n }\n const resolvedProjectId = normalizedTopicId ?? normalizedProjectId;\n if (!resolvedProjectId) {\n return;\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n resolvedProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\nexport type ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function 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\nexport type QuestionNodeDoc = Doc<\"epistemicNodes\"> & {\n anonymizationClass?: string;\n audienceLabel?: string;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n policyTags?: string[];\n projectId?: string;\n publicationStatus?: string;\n questionType?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n};\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nexport const MAX_QUESTION_PAGE_SIZE = 1000;\nexport interface QuestionScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\nexport function 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\nexport function dedupeQuestionNodes(\n nodes: QuestionNodeDoc[]\n): 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\nexport function normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nexport function resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return normalizeQuestionTopicId(scope.topicId);\n}\n\nexport function logQuestionFallback(\n message: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n debugGraphPrimitiveFallback(message, {\n error: formatGraphPrimitiveError(error),\n ...context,\n });\n}\n\nexport async function resolveQuestionScopeOrNull(\n ctx: QueryCtx | MutationCtx,\n args: QuestionScopeArgs\n) {\n if (!args.topicId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n projectId: args.projectId ?? undefined,\n topicId: args.topicId ?? undefined,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve question scope\",\n {\n error: formatGraphPrimitiveError(error),\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getQuestionNodesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: EpistemicTableQuery<QuestionNodeDoc>) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const topicNodes = await fetchNodes(\n ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexBuilder) =>\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\nexport async function getQuestionEdgesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n if (!scope.topicId) {\n return [];\n }\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId)\n );\n\n return await query.collect();\n}\n\nexport function 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\nexport function buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nexport function 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\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: Boolean(meta.isKeyQuestion),\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\nexport function 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\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 (\n typeof node.status === \"string\" &&\n INACTIVE_NODE_STATUSES.has(node.status)\n ) {\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 */\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\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 { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx } from \"./convex\";\nimport { internal, internalMutation } from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { insertEpistemicNode } from \"./epistemicInsert.js\";\n// =============================================================================\n// HELPERS\nimport {\n getQuestionNodesForScope,\n markProjectGraphDirty,\n normalizeQuestionTopicId,\n resolveQuestionScopeOrNull,\n} from \"./epistemicQuestions.helpers\";\nimport { generateGlobalId } from \"./globalId\";\nimport { optionalScopeArgs } from \"./topicScope\";\n\ninterface QuestionScopeArgs {\n projectId?: string;\n topicId?: string;\n}\n\ninterface CreateEvidenceFromScoredQuestionArgs extends QuestionScopeArgs {\n answerText: string;\n beliefId: string;\n conviction: number;\n questionNodeId: Id<\"epistemicNodes\">;\n questionText: string;\n rationale: string;\n relatedBeliefIds: string[];\n userId: string;\n}\n\ninterface BackfillScoredQuestionEvidenceArgs extends QuestionScopeArgs {\n dryRun?: boolean;\n userId: string;\n}\n\ninterface QuestionEvidenceNodeRow {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n globalId?: string;\n metadata: Record<string, unknown>;\n nodeType: string;\n}\n\ninterface BeliefNodeRow {\n _id: Id<\"epistemicNodes\">;\n globalId: string;\n nodeType: string;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | null {\n const normalized = readOptionalString(value);\n return normalized ? (normalized as Id<TableName>) : null;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value\n : [];\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readQuestionEvidenceNodeRow(\n value: unknown\n): QuestionEvidenceNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const nodeType = readOptionalString(record.nodeType);\n if (!(id && nodeType)) {\n return null;\n }\n\n const row: QuestionEvidenceNodeRow = {\n _id: id,\n metadata: readRecord(record.metadata) ?? {},\n nodeType,\n };\n const canonicalText = readOptionalString(record.canonicalText);\n if (canonicalText !== undefined) {\n row.canonicalText = canonicalText;\n }\n const globalId = readOptionalString(record.globalId);\n if (globalId !== undefined) {\n row.globalId = globalId;\n }\n return row;\n}\n\nfunction readBeliefNodeRow(value: unknown): BeliefNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const globalId = readOptionalString(record.globalId);\n const nodeType = readOptionalString(record.nodeType);\n return id && globalId && nodeType ? { _id: id, globalId, nodeType } : null;\n}\n\nfunction resolveCanonicalEdgeTopicId(\n args: QuestionScopeArgs\n): string | undefined {\n return normalizeQuestionTopicId(args.topicId);\n}\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 (\n ctx: MutationCtx,\n args: CreateEvidenceFromScoredQuestionArgs\n ) => {\n const now = Date.now();\n\n // Check if evidence was already created for this question (idempotent)\n const questionNode = readQuestionEvidenceNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (!questionNode) {\n return;\n }\n if (questionNode.nodeType !== \"question\") {\n return;\n }\n if (!questionNode.globalId) {\n throw new Error(\n \"Question node missing globalId; cannot create canonical evidence provenance edge\"\n );\n }\n const qMeta = questionNode.metadata;\n if (qMeta.evidenceNodeId) {\n return; // Already created\n }\n const edgeTopicId = resolveCanonicalEdgeTopicId(args);\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 insertEpistemicNode(ctx, {\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 beliefNodeId = readConvexId<\"epistemicNodes\">(bId);\n const node = beliefNodeId\n ? readBeliefNodeRow(await ctx.db.get(beliefNodeId))\n : null;\n if (node?.nodeType === \"belief\") {\n return node;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve belief node\",\n {\n error: formatGraphPrimitiveError(error),\n beliefId: bId,\n }\n );\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: edgeTopicId,\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: edgeTopicId,\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 (\n ctx: MutationCtx,\n args: BackfillScoredQuestionEvidenceArgs\n ) => {\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 .map(readQuestionEvidenceNodeRow)\n .filter((node): node is QuestionEvidenceNodeRow => node !== null);\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;\n return (\n meta.convictionStage === \"scored\" &&\n readOptionalString(meta.answer) &&\n !meta.evidenceNodeId &&\n (readOptionalString(meta.linkedBeliefId) ||\n readOptionalString(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;\n return {\n questionId: n._id,\n questionText: n.canonicalText?.slice(0, 80),\n beliefId:\n readOptionalString(meta.linkedBeliefId) ??\n readOptionalString(meta.beliefId),\n conviction: readFiniteNumber(meta.conviction),\n hasAnswer: readOptionalString(meta.answer) !== undefined,\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;\n const beliefId =\n readOptionalString(meta.linkedBeliefId) ??\n readOptionalString(meta.beliefId);\n const answerText = readOptionalString(meta.answer);\n const conviction = readFiniteNumber(meta.conviction) ?? 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: readStringArray(meta.relatedBeliefIds),\n conviction,\n rationale: readOptionalString(meta.convictionRationale) ?? \"\",\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 */\n"]}
@@ -772,16 +772,16 @@ function normalizeQuestionTopicId(topicId) {
772
772
  return typeof topicId === "string" && topicId.trim().length > 0 ? topicId : void 0;
773
773
  }
774
774
  function resolveQuestionScopeId(scope) {
775
- return normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? void 0;
775
+ return normalizeQuestionTopicId(scope.topicId);
776
776
  }
777
777
  function logQuestionFallback(message, error, context) {
778
778
  debugGraphPrimitiveFallback(message, {
779
779
  error: formatGraphPrimitiveError(error),
780
- ...context ?? {}
780
+ ...context
781
781
  });
782
782
  }
783
783
  async function resolveQuestionScopeOrNull(ctx, args) {
784
- if (!(args.projectId || args.topicId)) {
784
+ if (!args.topicId) {
785
785
  return null;
786
786
  }
787
787
  try {
@@ -814,9 +814,12 @@ async function getQuestionNodesForScope(ctx, scope, args) {
814
814
  );
815
815
  }
816
816
  async function getQuestionEdgesForScope(ctx, scope) {
817
+ if (!scope.topicId) {
818
+ return [];
819
+ }
817
820
  const query2 = ctx.db.query("epistemicEdges").withIndex(
818
821
  "by_topic",
819
- (q) => q.eq("topicId", scope.topicId || scope.projectId)
822
+ (q) => q.eq("topicId", scope.topicId)
820
823
  );
821
824
  return await query2.collect();
822
825
  }