@lucern/graph-primitives 1.0.16 → 1.0.18

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 (92) hide show
  1. package/dist/beliefEvidenceLinks.js +144 -99
  2. package/dist/beliefEvidenceLinks.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.operational.d.ts +29 -0
  4. package/dist/beliefEvidenceLinks.operational.js +157 -0
  5. package/dist/beliefEvidenceLinks.operational.js.map +1 -0
  6. package/dist/{beliefLifecycle-y8WLXqQj.d.ts → beliefLifecycle-CXwdDw5e.d.ts} +7 -4
  7. package/dist/beliefLifecycle.d.ts +1 -1
  8. package/dist/beliefLifecycle.js +75 -18
  9. package/dist/beliefLifecycle.js.map +1 -1
  10. package/dist/entityLifecycle.js +1 -12
  11. package/dist/entityLifecycle.js.map +1 -1
  12. package/dist/epistemicAnswers.js +1 -12
  13. package/dist/epistemicAnswers.js.map +1 -1
  14. package/dist/epistemicBeliefs.admin.js.map +1 -1
  15. package/dist/epistemicBeliefs.backfills.d.ts +1 -1
  16. package/dist/epistemicBeliefs.backfills.js +63 -35
  17. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  18. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  19. package/dist/epistemicBeliefs.confidence.js +70 -41
  20. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  21. package/dist/epistemicBeliefs.core.js +946 -566
  22. package/dist/epistemicBeliefs.core.js.map +1 -1
  23. package/dist/epistemicBeliefs.d.ts +2 -2
  24. package/dist/epistemicBeliefs.forkEvidence.d.ts +18 -0
  25. package/dist/epistemicBeliefs.forkEvidence.js +121 -0
  26. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -0
  27. package/dist/epistemicBeliefs.helpers.d.ts +2 -2
  28. package/dist/epistemicBeliefs.helpers.js +60 -32
  29. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  30. package/dist/epistemicBeliefs.internal.js +175 -51
  31. package/dist/epistemicBeliefs.internal.js.map +1 -1
  32. package/dist/epistemicBeliefs.js +437 -84
  33. package/dist/epistemicBeliefs.js.map +1 -1
  34. package/dist/epistemicBeliefs.lifecycle.d.ts +2 -2
  35. package/dist/epistemicBeliefs.lifecycle.js +75 -47
  36. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  37. package/dist/epistemicBeliefs.links.js +47 -13
  38. package/dist/epistemicBeliefs.links.js.map +1 -1
  39. package/dist/epistemicBeliefs.topicAnchor.d.ts +29 -0
  40. package/dist/epistemicBeliefs.topicAnchor.js +105 -0
  41. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -0
  42. package/dist/epistemicContracts.evaluators.js +71 -42
  43. package/dist/epistemicContracts.evaluators.js.map +1 -1
  44. package/dist/epistemicContracts.handlers.js +72 -54
  45. package/dist/epistemicContracts.handlers.js.map +1 -1
  46. package/dist/epistemicContracts.js +72 -54
  47. package/dist/epistemicContracts.js.map +1 -1
  48. package/dist/epistemicContracts.metrics.js +1 -1
  49. package/dist/epistemicContracts.metrics.js.map +1 -1
  50. package/dist/epistemicContracts.types.d.ts +1 -1
  51. package/dist/epistemicEdgeCreation.js +1 -12
  52. package/dist/epistemicEdgeCreation.js.map +1 -1
  53. package/dist/epistemicEdges.helpers.d.ts +1 -1
  54. package/dist/epistemicEvidence.js +173 -93
  55. package/dist/epistemicEvidence.js.map +1 -1
  56. package/dist/epistemicEvidenceMutations.js +173 -93
  57. package/dist/epistemicEvidenceMutations.js.map +1 -1
  58. package/dist/epistemicHelpers.js +1 -12
  59. package/dist/epistemicHelpers.js.map +1 -1
  60. package/dist/epistemicNodeCreation.js +1 -10
  61. package/dist/epistemicNodeCreation.js.map +1 -1
  62. package/dist/epistemicNodes.internal.js.map +1 -1
  63. package/dist/epistemicNodes.js +2 -2
  64. package/dist/epistemicNodes.js.map +1 -1
  65. package/dist/epistemicNodes.mutations.js +2 -2
  66. package/dist/epistemicNodes.mutations.js.map +1 -1
  67. package/dist/epistemicQuestions.create.js +1 -12
  68. package/dist/epistemicQuestions.create.js.map +1 -1
  69. package/dist/epistemicQuestions.evidence.js +1 -12
  70. package/dist/epistemicQuestions.evidence.js.map +1 -1
  71. package/dist/epistemicQuestions.js +1 -12
  72. package/dist/epistemicQuestions.js.map +1 -1
  73. package/dist/epistemicQuestions.tail.js +1 -12
  74. package/dist/epistemicQuestions.tail.js.map +1 -1
  75. package/dist/epistemicSources.js +1 -12
  76. package/dist/epistemicSources.js.map +1 -1
  77. package/dist/evaluators/index.js +1 -1
  78. package/dist/evaluators/index.js.map +1 -1
  79. package/dist/globalId-4y9SPpC_.d.ts +10 -0
  80. package/dist/globalId.d.ts +1 -1
  81. package/dist/globalId.js +1 -13
  82. package/dist/globalId.js.map +1 -1
  83. package/dist/helpers.js +1 -12
  84. package/dist/helpers.js.map +1 -1
  85. package/dist/index.d.ts +4 -3
  86. package/dist/index.js +771 -247
  87. package/dist/index.js.map +1 -1
  88. package/dist/invariantEnforcement.js +2 -2
  89. package/dist/invariantEnforcement.js.map +1 -1
  90. package/dist/proof-attestation.json +3 -3
  91. package/package.json +4 -4
  92. package/dist/globalId-DKh9d_uD.d.ts +0 -20
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/beliefLifecycle.ts","../src/convex.ts","../src/edges/contains.ts","../src/edges/utils.ts","../src/edges/contradicts.ts","../src/edges/dependsOn.ts","../src/edges/derivedFrom.ts","../src/edges/elaborates.ts","../src/edges/informs.ts","../src/edges/propagationTypes.ts","../src/edges/refutes.ts","../src/edges/supports.ts","../src/edges/tests.ts","../src/edges/index.ts","../src/debug.ts","../src/topicScope.ts","../src/workspaceIsolation.ts","../src/confidencePropagationDispatch.ts","../src/epistemicBeliefs.helpers.ts","../src/epistemicBeliefs.confidence.ts"],"names":["project","normalizeScopeValue","mkOpinion","v","readOpinionFromRecord","confidenceFromSL","detectTupleContradiction","evaluateTupleContradictionTransition"],"mappings":"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","file":"epistemicBeliefs.confidence.js","sourcesContent":["/**\n * Belief lifecycle helpers shared across Convex modules.\n *\n * Canonical lifecycle:\n * assumption -> hypothesis -> belief -> fact\n */\n\nexport type BeliefLifecycleStatus =\n | \"assumption\"\n | \"hypothesis\"\n | \"belief\"\n | \"fact\";\n\ntype PredictionOutcome =\n | \"pending\"\n | \"confirmed\"\n | \"disconfirmed\"\n | \"partial\"\n | \"expired\";\n\nconst BELIEF_STATUS_VALUES: readonly BeliefLifecycleStatus[] = [\n \"assumption\",\n \"hypothesis\",\n \"belief\",\n \"fact\",\n];\n\nconst RESOLVED_PREDICTION_OUTCOMES: readonly PredictionOutcome[] = [\n \"confirmed\",\n \"disconfirmed\",\n \"partial\",\n \"expired\",\n];\n\nexport function isBeliefLifecycleStatus(\n value: unknown\n): value is BeliefLifecycleStatus {\n return (\n typeof value === \"string\" &&\n BELIEF_STATUS_VALUES.includes(value as BeliefLifecycleStatus)\n );\n}\n\nfunction normalizeBeliefConfidence(confidence: unknown): number | null {\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n if (confidence >= 0 && confidence <= 1) {\n return confidence;\n }\n // Backward compatibility with historical percentage-scale confidence (0-100).\n if (confidence > 1 && confidence <= 100) {\n return confidence / 100;\n }\n return null;\n}\n\nexport function isResolvedByConfidence(confidence: unknown): boolean {\n const normalized = normalizeBeliefConfidence(confidence);\n if (normalized === null) {\n return false;\n }\n return normalized <= 0 || normalized >= 1;\n}\n\nexport function hasResolvedPredictionOutcome(predictionMeta: unknown): boolean {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return false;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n return (\n typeof outcome === \"string\" &&\n RESOLVED_PREDICTION_OUTCOMES.includes(outcome as PredictionOutcome)\n );\n}\n\nfunction getPredictionMetaFromMetadata(\n metadata: Record<string, unknown> | undefined\n): unknown {\n return metadata?.predictionMeta;\n}\n\nexport function shouldTreatBeliefAsFact(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (isResolvedByConfidence(opts.confidence)) {\n return true;\n }\n if (hasResolvedPredictionOutcome(opts.predictionMeta)) {\n return true;\n }\n if (\n hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))\n ) {\n return true;\n }\n return false;\n}\n\nexport function resolveBeliefLifecycleStatus(opts: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus {\n if (shouldTreatBeliefAsFact(opts)) {\n return \"fact\";\n }\n\n const direct = opts.beliefStatus;\n if (isBeliefLifecycleStatus(direct)) {\n // If the belief has been scored (has numeric credence) but stored status\n // is still pre-validation, promote to \"belief\". Scoring = merge to main.\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (normalized !== null && isPreValidationBeliefStatus(direct)) {\n return \"belief\";\n }\n return direct;\n }\n\n const metaStatus = opts.metadata?.beliefStatus;\n if (isBeliefLifecycleStatus(metaStatus)) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (normalized !== null && isPreValidationBeliefStatus(metaStatus)) {\n return \"belief\";\n }\n return metaStatus;\n }\n\n return \"assumption\";\n}\n\nexport function isPreValidationBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"assumption\" || status === \"hypothesis\";\n}\n\nexport function isPropagationEligibleBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"belief\" || status === \"fact\";\n}\n\nexport function promoteBeliefStatusAfterScoring(\n status: BeliefLifecycleStatus,\n opts?: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n }\n): BeliefLifecycleStatus {\n if (shouldTreatBeliefAsFact({ ...opts })) {\n return \"fact\";\n }\n if (isPreValidationBeliefStatus(status)) {\n return \"belief\";\n }\n return status === \"fact\" ? \"fact\" : \"belief\";\n}\n","import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const containsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contains\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Structural containment only. Traversed for explicit semantics, but it never propagates opinions.\",\n};\n\n","import {\n applyNegativeEvidence,\n applyNegativeSupport,\n cumulativeFusion,\n project,\n trustDiscount,\n type EdgeMetadata,\n type PropagationResult,\n type SLOpinion,\n} from \"@lucern/confidence\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n} from \"./propagationTypes\";\n\nexport function readEdgeMetadata<TNodeId extends string>(\n edge: PropagationEdgeRecord<TNodeId>\n): EdgeMetadata {\n return {\n constraint: edge.constraint ?? undefined,\n normalization: edge.normalization ?? undefined,\n propagation: edge.propagation ?? undefined,\n conditionalA: edge.conditionalA ?? undefined,\n conditionalNotA: edge.conditionalNotA ?? undefined,\n };\n}\n\nexport function applyPerHopDamping(\n sourceOpinion: SLOpinion,\n damping: number\n): SLOpinion {\n if (damping >= 1) {\n return sourceOpinion;\n }\n\n return trustDiscount(sourceOpinion, Math.max(0, damping));\n}\n\nexport function annotateRationale(\n result: PropagationResult,\n spec: EdgePropagationSpec,\n hop: number\n): PropagationResult {\n return {\n ...result,\n rationale: `hop=${hop} edge=${spec.edgeType} damping=${spec.damping.toFixed(\n 2\n )} :: ${result.rationale}`,\n };\n}\n\nexport function propagatePositiveSupport(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(\n 2\n )}) from source at ${project(sourceOpinion).toFixed(2)}`,\n };\n}\n\nexport function propagatePositiveInform(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(2)})`,\n };\n}\n\nexport function propagateNegativeSupportWithMetadata(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number,\n edge: PropagationEdgeRecord\n): PropagationResult {\n return applyNegativeSupport(\n sourceOpinion,\n targetOpinion,\n edgeWeight,\n readEdgeMetadata(edge)\n );\n}\n\nexport const propagateNegativeInform = applyNegativeEvidence;\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n} from \"./utils\";\n\nexport const contradictsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contradicts\",\n direction: \"bidirectional\",\n transitivity: \"none\",\n damping: 0.85,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n negativeWeight,\n edge\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Legacy contradiction edges move negative pressure in either direction, but never beyond one hop.\",\n};\n\n","import {\n conditionalDeduction,\n dampedDependencyCascade,\n mkOpinion,\n project,\n} from \"@lucern/confidence\";\nimport type { EdgePropagationSpec } from \"./propagationTypes\";\nimport { annotateRationale, applyPerHopDamping, readEdgeMetadata } from \"./utils\";\n\nexport const dependsOnPropagationSpec: EdgePropagationSpec = {\n edgeType: \"depends_on\",\n direction: \"incoming\",\n transitivity: \"damped\",\n damping: 0.8,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const metadata = readEdgeMetadata(edge);\n\n if (metadata.conditionalA && metadata.conditionalNotA) {\n const deducedOpinion = conditionalDeduction(\n dampedSource,\n mkOpinion(\n metadata.conditionalA.b,\n metadata.conditionalA.d,\n metadata.conditionalA.u,\n metadata.conditionalA.a\n ),\n mkOpinion(\n metadata.conditionalNotA.b,\n metadata.conditionalNotA.d,\n metadata.conditionalNotA.u,\n metadata.conditionalNotA.a\n ),\n targetOpinion.a\n );\n\n return annotateRationale(\n {\n opinion: deducedOpinion,\n operator: \"conditional_deduction\",\n rationale: `Conditional deduction: prerequisite at ${project(\n dampedSource\n ).toFixed(2)}`,\n },\n context.spec,\n context.hop\n );\n }\n\n const result = dampedDependencyCascade(\n dampedSource,\n targetOpinion,\n metadata.propagation ?? \"continuous\"\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Structural gating. Textbook conditional deduction when edge conditionals exist, otherwise damped dependency cascade through downstream chains.\",\n};\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const derivedFromPropagationSpec: EdgePropagationSpec = {\n edgeType: \"derived_from\",\n direction: \"incoming\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Provenance only. The traversal surface stays explicit, but confidence does not move across derived_from edges.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const elaboratesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"elaborates\",\n direction: \"outgoing\",\n transitivity: \"damped\",\n damping: 0.7,\n maxHops: 2,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const contextualWeight = Math.min(Math.abs(edge.weight ?? 0.35), 0.35);\n const result = propagatePositiveInform(\n dampedSource,\n targetOpinion,\n contextualWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Context-rich supporting detail. Elaborates carries a small positive effect with short, damped chaining.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const informsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"informs\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.92,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeInform(dampedSource, targetOpinion, weight)\n : propagatePositiveInform(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Evidence-bearing influence. Informs can chain through the graph with light per-hop damping.\",\n};\n\n","import type {\n EdgeMetadata,\n PropagationResult,\n SLOpinion,\n} from \"@lucern/confidence\";\n\nexport type PropagationTraversalDirection = \"outgoing\" | \"incoming\";\n\nexport type PropagationSpecDirection =\n | PropagationTraversalDirection\n | \"bidirectional\";\n\nexport type PropagationEdgeType =\n | \"supports\"\n | \"depends_on\"\n | \"informs\"\n | \"contains\"\n | \"tests\"\n | \"derived_from\"\n | \"contradicts\"\n | \"refutes\"\n | \"elaborates\";\n\nexport type PropagationEdgeRecord<TNodeId extends string = string> = {\n fromNodeId?: TNodeId | null;\n toNodeId?: TNodeId | null;\n edgeType: string;\n weight?: number | null;\n constraint?: EdgeMetadata[\"constraint\"] | null;\n normalization?: EdgeMetadata[\"normalization\"] | null;\n propagation?: EdgeMetadata[\"propagation\"] | null;\n conditionalA?: EdgeMetadata[\"conditionalA\"] | null;\n conditionalNotA?: EdgeMetadata[\"conditionalNotA\"] | null;\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type EdgePropagationSpec<TNodeId extends string = string> = {\n edgeType: PropagationEdgeType;\n direction: PropagationSpecDirection;\n transitivity: \"none\" | \"damped\" | \"full\";\n damping: number;\n maxHops: number | \"unbounded\";\n operator: (\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edge: PropagationEdgeRecord<TNodeId>,\n context: {\n hop: number;\n sourceNodeId: TNodeId;\n targetNodeId: TNodeId;\n traversedDirection: PropagationTraversalDirection;\n spec: EdgePropagationSpec<TNodeId>;\n }\n ) => PropagationResult | null;\n description: string;\n};\n\nexport function isPropagationTraversalDirection(\n direction: string\n): direction is PropagationTraversalDirection {\n return direction === \"outgoing\" || direction === \"incoming\";\n}\n\nexport function canTraverseHop<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n nextHop: number\n): boolean {\n return spec.maxHops === \"unbounded\" || nextHop <= spec.maxHops;\n}\n\nexport function canContinueTransitively<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n currentHop: number\n): boolean {\n if (spec.transitivity === \"none\") {\n return false;\n }\n\n return spec.maxHops === \"unbounded\" || currentHop < spec.maxHops;\n}\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n} from \"./utils\";\n\nexport const refutesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"refutes\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 0.9,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeInform(\n dampedSource,\n targetOpinion,\n negativeWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Explicit negative evidence semantics. Refutes is treated as strong one-hop counter-evidence.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n propagatePositiveSupport,\n} from \"./utils\";\n\nexport const supportsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"supports\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.85,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n weight,\n edge\n )\n : propagatePositiveSupport(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Belief-to-belief influence. Supports chains transitively with moderate per-hop damping.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const testsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"tests\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Interrogation linkage only. Tests edges do not directly move confidence.\",\n};\n\n","import { containsPropagationSpec } from \"./contains\";\nimport { contradictsPropagationSpec } from \"./contradicts\";\nimport { dependsOnPropagationSpec } from \"./dependsOn\";\nimport { derivedFromPropagationSpec } from \"./derivedFrom\";\nimport { elaboratesPropagationSpec } from \"./elaborates\";\nimport { informsPropagationSpec } from \"./informs\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport { refutesPropagationSpec } from \"./refutes\";\nimport { supportsPropagationSpec } from \"./supports\";\nimport { testsPropagationSpec } from \"./tests\";\n\nexport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nexport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\n\nexport const EDGE_PROPAGATION_SPECS: readonly EdgePropagationSpec[] = [\n supportsPropagationSpec,\n informsPropagationSpec,\n dependsOnPropagationSpec,\n derivedFromPropagationSpec,\n containsPropagationSpec,\n testsPropagationSpec,\n contradictsPropagationSpec,\n refutesPropagationSpec,\n elaboratesPropagationSpec,\n] as const;\n\nconst EDGE_PROPAGATION_SPEC_MAP = new Map<\n PropagationEdgeType,\n EdgePropagationSpec\n>(EDGE_PROPAGATION_SPECS.map((spec) => [spec.edgeType, spec]));\n\nexport function getEdgePropagationSpec(\n edgeType: string\n): EdgePropagationSpec | undefined {\n return EDGE_PROPAGATION_SPEC_MAP.get(edgeType as PropagationEdgeType);\n}\n\nexport function getEdgePropagationSpecs(): readonly EdgePropagationSpec[] {\n return EDGE_PROPAGATION_SPECS;\n}\n\nexport function getTraversalDirections(\n direction: PropagationSpecDirection\n): readonly PropagationTraversalDirection[] {\n if (isPropagationTraversalDirection(direction)) {\n return [direction];\n }\n\n return [\"outgoing\", \"incoming\"];\n}\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\n};\n\nexport function normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction throwWorkspaceIsolationError(args: {\n message: string;\n invariantCode: string;\n suggestion: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = 409;\n error.code = \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function assertWorkspaceScopedEpistemicNodeScope(args: {\n scope: TopicProjectScope;\n nodeType: string;\n mutationName: string;\n}): void {\n const layer = isNodeType(args.nodeType)\n ? getLayerForNodeType(args.nodeType)\n : undefined;\n if (layer === \"ontological\") {\n return;\n }\n\n const workspaceId = normalizeScopeValue(args.scope.workspaceId);\n if (workspaceId) {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n \"Workspace-scoped reasoning isolation requires workspaceId on non-ontological node creation.\",\n invariantCode: \"workspace.scope_required_for_epistemic_nodes\",\n suggestion:\n \"Resolve the topic/project scope through a workspace-bound topic before creating epistemic nodes.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n topicId: args.scope.topicId,\n projectId: args.scope.projectId,\n },\n });\n}\n\nexport function nodeMatchesWorkspaceReasoningScope(\n node: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!node) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const nodeTenantId = normalizeScopeValue(node.tenantId);\n const nodeWorkspaceId = normalizeScopeValue(node.workspaceId);\n const epistemicLayer =\n typeof node.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n\n if (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\n return false;\n }\n\n // Ontological entities are tenant-global (no workspace required)\n if (epistemicLayer === \"ontological\" && nodeWorkspaceId === undefined) {\n return true;\n }\n\n // Published nodes are visible at tenant scope — the microservice API surface.\n // The node stays in its workspace, but tenant-scope queries can see it.\n if (!scopeWorkspaceId && node.publicationStatus === \"published\") {\n return true;\n }\n\n if (!scopeWorkspaceId) {\n return nodeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === nodeWorkspaceId;\n}\n\nexport function edgeMatchesWorkspaceReasoningScope(\n edge: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!edge) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const edgeTenantId = normalizeScopeValue(edge.tenantId);\n const edgeWorkspaceId = normalizeScopeValue(edge.workspaceId);\n\n if (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\n return false;\n }\n\n if (!scopeWorkspaceId) {\n return edgeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === edgeWorkspaceId;\n}\n\nexport async function resolveNodeScopeForWorkspaceIsolation(\n ctx: any,\n node: ScopeLike | null | undefined\n): Promise<{\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n nodeType?: string;\n}> {\n const epistemicLayer =\n typeof node?.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n const resolved = {\n tenantId: normalizeScopeValue(node?.tenantId),\n workspaceId: normalizeScopeValue(node?.workspaceId),\n epistemicLayer,\n nodeType: typeof node?.nodeType === \"string\" ? node.nodeType : undefined,\n };\n\n if (!node) {\n return resolved;\n }\n\n if (resolved.epistemicLayer === \"ontological\") {\n return resolved;\n }\n\n if (resolved.tenantId || resolved.workspaceId) {\n return resolved;\n }\n\n if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n if (node.projectId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n projectId: String(node.projectId),\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n return resolved;\n}\n\nexport function resolveRuntimePackMutationContext(args: {\n runtimeToolName?: string;\n runtimePackKey?: string;\n runtimePackInstallScope?: \"tenant\" | \"workspace\";\n}): RuntimePackMutationContext | undefined {\n if (\n !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\n ) {\n return;\n }\n\n return {\n toolName: args.runtimeToolName,\n packKey: args.runtimePackKey,\n packInstallScope: args.runtimePackInstallScope,\n };\n}\n\nexport function assertTenantPackWorkspaceMutationAllowed(args: {\n runtime?: RuntimePackMutationContext;\n target: ScopeLike;\n mutationName: string;\n}): void {\n if (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\n return;\n }\n\n const targetWorkspaceId = normalizeScopeValue(args.target.workspaceId);\n const targetLayer =\n typeof args.target.epistemicLayer === \"string\"\n ? args.target.epistemicLayer\n : undefined;\n\n if (!targetWorkspaceId || targetLayer === \"ontological\") {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n `Tenant-scoped pack \"${args.runtime.packKey}\" cannot mutate workspace-scoped reasoning state.`,\n invariantCode: \"workspace.tenant_pack_reasoning_write_forbidden\",\n suggestion:\n \"Use a workspace-scoped pack for workspace-local graph mutations, or route the change through tenant-global canonical entity flows.\",\n details: {\n mutationName: args.mutationName,\n toolName: args.runtime.toolName,\n packKey: args.runtime.packKey,\n targetWorkspaceId,\n targetNodeType: args.target.nodeType,\n targetLayer,\n },\n });\n}\n","import {\n hasProjectedOpinionChanged,\n mkOpinion,\n readOpinionFromRecord,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n getEdgePropagationSpecs,\n getTraversalDirections,\n type EdgePropagationSpec,\n type PropagationEdgeRecord,\n type PropagationEdgeType,\n type PropagationTraversalDirection,\n} from \"./edges\";\nimport {\n edgeMatchesWorkspaceReasoningScope,\n nodeMatchesWorkspaceReasoningScope,\n} from \"./workspaceIsolation\";\n\nexport type PropagationDispatchScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type PropagationDispatchNode<TNodeId extends string = string> = {\n _id?: TNodeId;\n nodeType?: string;\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n publicationStatus?: string;\n metadata?: unknown;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n opinion_a?: number;\n};\n\nexport type PropagationDispatchEdge<TNodeId extends string = string> =\n PropagationEdgeRecord<TNodeId>;\n\nexport type ConfidencePropagationDispatch<TNodeId extends string = string> = {\n targetNodeId: TNodeId;\n edgeType: PropagationEdgeType;\n traversedDirection: PropagationTraversalDirection;\n weight: number;\n opinion: SLOpinion;\n operator: SLOperator;\n rationale: string;\n hop: number;\n};\n\nfunction resolveTraversalTargetNodeId<TNodeId extends string>(\n edge: PropagationDispatchEdge<TNodeId>,\n direction: PropagationTraversalDirection\n): TNodeId | undefined {\n const targetNodeId =\n direction === \"outgoing\" ? edge.toNodeId : edge.fromNodeId;\n return targetNodeId ?? undefined;\n}\n\nfunction readNodeOpinion<TNodeId extends string>(\n node: PropagationDispatchNode<TNodeId>\n): SLOpinion {\n const metadata = (node.metadata ?? {}) as Record<string, unknown>;\n\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch {\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport async function collectConfidencePropagationDispatches<\n TNodeId extends string = string,\n>(args: {\n sourceNodeId: TNodeId;\n sourceOpinion: SLOpinion;\n sourceScope?: PropagationDispatchScope;\n traversalSpecs?: readonly EdgePropagationSpec<TNodeId>[];\n queryEdges: (args: {\n nodeId: TNodeId;\n spec: EdgePropagationSpec<TNodeId>;\n direction: PropagationTraversalDirection;\n hop: number;\n }) => Promise<ReadonlyArray<PropagationDispatchEdge<TNodeId>>>;\n getNode: (\n nodeId: TNodeId\n ) => Promise<PropagationDispatchNode<TNodeId> | null | undefined>;\n}): Promise<ConfidencePropagationDispatch<TNodeId>[]> {\n const dispatchesByTargetId = new Map<\n string,\n ConfidencePropagationDispatch<TNodeId>\n >();\n const opinionCache = new Map<string, SLOpinion>();\n const nodeCache = new Map<\n string,\n PropagationDispatchNode<TNodeId> | null | undefined\n >();\n const traversalSpecs = (args.traversalSpecs ??\n getEdgePropagationSpecs()) as readonly EdgePropagationSpec<TNodeId>[];\n const queue: Array<{\n nodeId: TNodeId;\n opinion: SLOpinion;\n hop: number;\n visitedNodeIds: Set<string>;\n }> = [\n {\n nodeId: args.sourceNodeId,\n opinion: args.sourceOpinion,\n hop: 0,\n visitedNodeIds: new Set([String(args.sourceNodeId)]),\n },\n ];\n\n const loadNode = async (nodeId: TNodeId) => {\n const cacheKey = String(nodeId);\n if (!nodeCache.has(cacheKey)) {\n nodeCache.set(cacheKey, await args.getNode(nodeId));\n }\n return nodeCache.get(cacheKey) ?? null;\n };\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) {\n continue;\n }\n\n for (const spec of traversalSpecs) {\n const nextHop = state.hop + 1;\n if (!canTraverseHop(spec, nextHop)) {\n continue;\n }\n\n for (const direction of getTraversalDirections(spec.direction)) {\n const edges = await args.queryEdges({\n nodeId: state.nodeId,\n spec,\n direction,\n hop: nextHop,\n });\n\n for (const edge of edges) {\n if (\n args.sourceScope &&\n !edgeMatchesWorkspaceReasoningScope(edge, args.sourceScope)\n ) {\n continue;\n }\n\n const targetNodeId = resolveTraversalTargetNodeId(edge, direction);\n if (!targetNodeId) {\n continue;\n }\n\n if (state.visitedNodeIds.has(String(targetNodeId))) {\n continue;\n }\n\n const targetNode = await loadNode(targetNodeId);\n if (!targetNode || targetNode.nodeType !== \"belief\") {\n continue;\n }\n\n if (\n args.sourceScope &&\n !nodeMatchesWorkspaceReasoningScope(targetNode, args.sourceScope)\n ) {\n continue;\n }\n\n const cacheKey = String(targetNodeId);\n const targetOpinion =\n opinionCache.get(cacheKey) ?? readNodeOpinion(targetNode);\n const result = spec.operator(state.opinion, targetOpinion, edge, {\n hop: nextHop,\n sourceNodeId: state.nodeId,\n targetNodeId,\n traversedDirection: direction,\n spec,\n });\n\n if (\n !result ||\n !hasProjectedOpinionChanged(targetOpinion, result.opinion)\n ) {\n continue;\n }\n\n const projectedOpinion = mkOpinion(\n result.opinion.b,\n result.opinion.d,\n result.opinion.u,\n result.opinion.a\n );\n\n opinionCache.set(cacheKey, projectedOpinion);\n\n const existingDispatch = dispatchesByTargetId.get(cacheKey);\n dispatchesByTargetId.set(cacheKey, {\n targetNodeId,\n edgeType: spec.edgeType,\n traversedDirection: direction,\n weight: edge.weight ?? 1,\n opinion: projectedOpinion,\n operator: result.operator,\n rationale: existingDispatch\n ? `${existingDispatch.rationale}; ${result.rationale}`\n : result.rationale,\n hop: nextHop,\n });\n\n if (canContinueTransitively(spec, nextHop)) {\n queue.push({\n nodeId: targetNodeId,\n opinion: projectedOpinion,\n hop: nextHop,\n visitedNodeIds: new Set([\n ...state.visitedNodeIds,\n String(targetNodeId),\n ]),\n });\n }\n }\n }\n }\n }\n\n return Array.from(dispatchesByTargetId.values()).sort((left, right) => {\n if (left.hop !== right.hop) {\n return left.hop - right.hop;\n }\n return String(left.targetNodeId).localeCompare(String(right.targetNodeId));\n });\n}\n","/**\n * Epistemic Beliefs API\n *\n * Clean API for managing beliefs in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces beliefs.ts.\n *\n * Key differences from beliefs.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no runtime ID translation fallback)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\n\n// All IDs now use epistemicNodes exclusively\nexport const insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_PROJECT_BELIEF_LIMIT = 250;\nexport const MAX_PROJECT_BELIEF_LIMIT = 1000;\nexport const optionalBeliefScopeArgs = optionalScopeArgs;\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype BeliefScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\n\ntype EpistemicNodeOpinionDoc = Doc<\"epistemicNodes\"> & {\n opinion_a?: number;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n tupleContradicted?: boolean;\n userId?: string;\n metadata?: Record<string, unknown> | null;\n};\n\ntype EpistemicIndexQuery = {\n eq(field: string, value: unknown): EpistemicIndexQuery;\n gt(field: string, value: unknown): EpistemicIndexQuery;\n lt(field: string, value: unknown): EpistemicIndexQuery;\n field(field: string): string;\n};\n\ntype EpistemicQueryChain<T> = {\n withIndex(\n _name: string,\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n order(direction: \"asc\" | \"desc\"): EpistemicQueryChain<T>;\n filter(\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n first(): Promise<T | null>;\n collect(): Promise<T[]>;\n take(limit: number): Promise<T[]>;\n};\n\ntype EpistemicBeliefCtx = QueryCtx & {\n db: {\n query<T = unknown>(_table: string): EpistemicQueryChain<T>;\n get<T = unknown>(id: Id<string>): Promise<T | null>;\n };\n scheduler: {\n runAfter(\n _delayMs: number,\n _handler: unknown,\n _args: unknown,\n ): Promise<unknown>;\n };\n};\n\ntype AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nconst DEFAULT_CONFIDENCE_POLICY: ConfidencePolicyConfig = {\n scoringMode: \"after_worktree\",\n tupleContradiction: normalizeTupleContradictionPolicy(),\n};\n\nexport type BeliefConfidenceTrigger =\n | \"initial\"\n | \"evidence_added\"\n | \"evidence_removed\"\n | \"contradiction_detected\"\n | \"contradiction_resolved\"\n | \"manual\"\n | \"decay\"\n | \"agent_assessment\"\n | \"worktree_outcome\"\n | \"worktree_completed\"\n // SL-specific triggers\n | \"fusion\"\n | \"discount\"\n | \"deduction\"\n | \"backfill_synthetic\"\n | VerificationConfidenceTrigger;\n\nexport function throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredMutationError;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function assertBaseRateInRange(baseRate: number, field = \"baseRate\"): number {\n if (baseRate < 0 || baseRate > 1) {\n throwStructuredMutationError({\n message: `${field} must be within [0, 1].`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"request.valid_shape\",\n suggestion: `Clamp ${field} into the inclusive [0, 1] interval.`,\n details: { field, baseRate },\n });\n }\n return baseRate;\n}\n\nexport function buildBeliefConfidenceRow(args: {\n beliefId: Id<\"epistemicNodes\">;\n belief: number;\n disbelief: number;\n uncertainty: number;\n baseRate: number;\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n assessedBy: string;\n assessedAt: number;\n slOperator?: SLOperator;\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringContradictionId?: Id<\"contradictions\">;\n triggeringWorktreeId?: string;\n}) {\n return {\n beliefId: args.beliefId,\n confidence: confidenceFromSL(\n args.belief,\n args.disbelief,\n args.uncertainty,\n args.baseRate,\n ),\n belief: args.belief,\n disbelief: args.disbelief,\n uncertainty: args.uncertainty,\n baseRate: args.baseRate,\n slOperator: args.slOperator ?? (\"manual_assessment\" as const),\n trigger: args.trigger,\n ...(args.rationale ? { rationale: args.rationale } : {}),\n assessedBy: args.assessedBy,\n assessedAt: args.assessedAt,\n ...(args.triggeringEvidenceId\n ? {\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringEvidenceIds: [String(args.triggeringEvidenceId)],\n }\n : {}),\n ...(args.triggeringContradictionId\n ? {\n triggeringContradictionId: args.triggeringContradictionId,\n }\n : {}),\n ...(args.triggeringWorktreeId\n ? { triggeringWorktreeId: args.triggeringWorktreeId }\n : {}),\n };\n}\n\ntype BeliefStatusResult =\n | { success: true }\n | { success: false; message: \"Evidence node not found\" };\n\nexport function buildBeliefStatusSuccessResult(): BeliefStatusResult {\n return { success: true };\n}\n\nexport function buildBeliefEvidenceNotFoundResult(): BeliefStatusResult {\n const result = {} as Extract<BeliefStatusResult, { success: false }>;\n result.success = false;\n result.message = \"Evidence node not found\";\n return result;\n}\n\nexport function deriveSyntheticBackfillOpinion(\n source: Record<string, unknown>,\n): SLOpinion {\n const belief =\n readFiniteNumber(source.opinion_b) ?? readFiniteNumber(source.belief);\n const disbelief =\n readFiniteNumber(source.opinion_d) ?? readFiniteNumber(source.disbelief);\n const uncertainty =\n readFiniteNumber(source.opinion_u) ?? readFiniteNumber(source.uncertainty);\n const baseRate =\n readFiniteNumber(source.opinion_a) ?? readFiniteNumber(source.baseRate);\n\n if (\n belief !== undefined ||\n disbelief !== undefined ||\n uncertainty !== undefined ||\n baseRate !== undefined\n ) {\n try {\n return readOpinionFromRecord(source);\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to decode legacy belief opinion\",\n {\n error,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n }\n\n const confidence = clamp01(readFiniteNumber(source.confidence) ?? 0);\n return mkOpinion(confidence, 1 - confidence, 0, 0.5);\n}\n\nexport function clampBeliefLimit(\n limit: number | undefined,\n fallback = DEFAULT_PROJECT_BELIEF_LIMIT,\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_PROJECT_BELIEF_LIMIT),\n );\n}\n\nexport function readTupleContradictedFlag(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readBeliefOpinionSnapshot(\n node: Doc<\"epistemicNodes\">,\n metadata: Record<string, unknown>,\n): SLOpinion {\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: (node as any).opinion_b,\n opinion_d: (node as any).opinion_d,\n opinion_u: (node as any).opinion_u,\n opinion_a: (node as any).opinion_a,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to read belief opinion snapshot\",\n {\n error,\n beliefId: node._id,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport function deriveTupleContradictionSeverity(\n node: Doc<\"epistemicNodes\">,\n): \"critical\" | \"significant\" | \"minor\" {\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const criticality =\n typeof metadata.criticality === \"string\" ? metadata.criticality : undefined;\n\n if (criticality === \"blocking\") {\n return \"critical\";\n }\n if (criticality === \"supporting\") {\n return \"minor\";\n }\n return \"significant\";\n}\n\nexport function formatTupleContradictionDescription(args: {\n opinion: Opinion;\n policy: ConfidencePolicyConfig[\"tupleContradiction\"];\n}): string {\n return `Tuple-space contradiction detected: b=${args.opinion.b.toFixed(2)} > ${args.policy.beliefThreshold.toFixed(2)} and d=${args.opinion.d.toFixed(2)} > ${args.policy.disbeliefThreshold.toFixed(2)}.`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `belief:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function resolveBeliefWorktreeId(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n const worktreeId = metadata?.worktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n\n const sprintId = metadata?.sprintId;\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\n// Map pillar names to valid pillar literals\ntype ValidPillar =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"regulatory\"\n | \"timing\"\n | \"customer\"\n | \"technology\"\n | \"distribution\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizePillar(pillar?: string): ValidPillar {\n if (!pillar) {\n return \"other\";\n }\n const lower = pillar.toLowerCase();\n const validPillars: ValidPillar[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n \"deal\",\n \"risks\",\n ];\n return (validPillars.find((p) => lower.includes(p)) ||\n \"other\") as ValidPillar;\n}\n\nexport async function markBeliefGraphDirty(\n ctx: EpistemicBeliefCtx,\n scope: { projectId?: string | null; topicId?: string | null },\n): Promise<void> {\n const projectId =\n typeof scope.projectId === \"string\" && scope.projectId.trim().length > 0\n ? scope.projectId\n : undefined;\n const topicId =\n typeof scope.topicId === \"string\" && scope.topicId.trim().length > 0\n ? scope.topicId\n : undefined;\n\n if (!projectId && !topicId) {\n return;\n }\n\n if (projectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n { projectId },\n );\n }\n if (topicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n { topicId },\n );\n }\n\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n topicId ?? projectId!,\n {\n lastActivityAt: Date.now(),\n },\n );\n}\n\nexport async function resolveBeliefScopeOrNull(\n ctx: QueryCtx,\n args: BeliefScopeArgs,\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 \"[epistemicBeliefs] Failed to resolve belief scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n },\n );\n return null;\n }\n}\n\nexport async function getBeliefNodesForScope(\n ctx: EpistemicBeliefCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number; status?: string },\n) {\n const baseQuery = ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\"),\n );\n const nodes: EpistemicNodeOpinionDoc[] =\n typeof args?.scanLimit === \"number\"\n ? (await baseQuery.order(\"desc\").take(args.scanLimit)) as EpistemicNodeOpinionDoc[]\n : (await baseQuery.collect()) as EpistemicNodeOpinionDoc[];\n const scopedNodes = nodes.filter((node: Doc<\"epistemicNodes\">) =>\n nodeMatchesWorkspaceReasoningScope(node, scope),\n );\n\n if (!args?.status) {\n return scopedNodes;\n }\n\n return scopedNodes.filter((node: EpistemicNodeOpinionDoc) => node.status === args.status);\n}\n\nexport function createBeliefAudienceResolver(\n registryRows: Array<{\n audienceKey?: string | null;\n audienceClass: AudienceClass;\n }>,\n) {\n const audienceClassByKey = new Map<string, AudienceClass>(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ]),\n );\n\n return (\n audienceKey: string | undefined | null,\n fallback: AudienceClass,\n ): AudienceClass => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return (\n audienceClassByKey.get(key) ??\n (classFromAudienceKey(key, fallback) as AudienceClass)\n );\n };\n}\n\nexport function flattenBeliefNode(node: Doc<\"epistemicNodes\">) {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const worktreeId = resolveBeliefWorktreeId(meta);\n const tupleContradicted =\n readTupleContradictedFlag(\n (node as EpistemicNodeOpinionDoc).tupleContradicted,\n ) ??\n readTupleContradictedFlag(meta.tupleContradicted) ??\n false;\n\n return {\n _id: node._id,\n _epistemicNodeId: node._id,\n _creationTime: node._creationTime,\n belief: node.canonicalText,\n formulation: node.canonicalText,\n projectId: node.projectId,\n topicId: node.topicId,\n userId: (node as EpistemicNodeOpinionDoc).userId || node.createdBy || \"\",\n confidence: (meta.confidence as \"high\" | \"medium\" | \"low\") || \"untested\",\n status: node.status,\n beliefStatus: resolveBeliefStatus(node, meta),\n topic: (meta.topic as string) || (meta.pillar as string) || \"other\",\n pillar: (meta.pillar as string) || (meta.topic as string) || \"\",\n category: (meta.category as string) || \"\",\n subcategory: (meta.subcategory as string) || \"\",\n categoryIcon: (meta.categoryIcon as string) || \"\",\n supportingEvidence: (meta.supportingEvidenceIds as string[]) || [],\n contradictingEvidence: (meta.contradictingEvidenceIds as string[]) || [],\n testingQuestions: (meta.testingQuestionIds as string[]) || [],\n linkedInsights: (meta.linkedInsightIds as string[]) || [],\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || node.createdAt,\n tupleContradicted,\n sprintId: (meta.sprintId as string) || undefined,\n worktreeId,\n sourceBeliefIds: (meta.sourceBeliefIds as string[]) || undefined,\n criticality:\n (meta.criticality as\n | \"critical\"\n | \"supporting\"\n | \"nice_to_have\"\n | \"unanalyzed\"\n | \"blocking\"\n | \"important\") || \"unanalyzed\",\n rationale: (meta.rationale as string) || \"\",\n audienceLabel: node.audienceLabel,\n policyTags: node.policyTags,\n sensitivityTier: node.sensitivityTier,\n exportClass: node.exportClass,\n anonymizationClass: node.anonymizationClass,\n };\n}\n\nexport function resolveBeliefStatus(\n node: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n },\n metadata: Record<string, unknown>,\n): BeliefLifecycleStatus {\n return resolveBeliefLifecycleStatus({\n beliefStatus: node.beliefStatus,\n confidence: node.confidence,\n predictionMeta: node.predictionMeta,\n metadata,\n });\n}\n\nexport async function hasCompletedWorktreeForBelief(\n ctx: EpistemicBeliefCtx,\n beliefNodeId: Id<\"epistemicNodes\">,\n): Promise<boolean> {\n // Check if the belief is linked to a completed worktree via worktreeBeliefCluster\n const clusterMembership = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_belief\", (q: any) => q.eq(\"beliefId\", beliefNodeId))\n .collect();\n for (const membership of clusterMembership) {\n const worktree = await ctx.db.get(membership.worktreeId);\n if (worktree?.status === \"completed\" || worktree?.status === \"merged\") {\n return true;\n }\n }\n return false;\n}\n\nexport async function getActiveConfidencePolicy(\n ctx: EpistemicBeliefCtx,\n): Promise<ConfidencePolicyConfig> {\n try {\n const activeConfig = await ctx.db\n .query(\"logicSprintScoring\")\n .withIndex(\"by_active\", (q: any) => q.eq(\"isActive\", true))\n .first();\n\n return {\n scoringMode:\n activeConfig?.confidencePolicy === \"always\"\n ? \"always\"\n : DEFAULT_CONFIDENCE_POLICY.scoringMode,\n tupleContradiction: normalizeTupleContradictionPolicy(\n activeConfig?.tupleContradictionPolicy as\n | Partial<ConfidencePolicyConfig[\"tupleContradiction\"]>\n | undefined,\n ),\n };\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to load active confidence policy\",\n {\n error,\n },\n );\n // K-tier/component environments do not carry logicSprintScoring.\n return DEFAULT_CONFIDENCE_POLICY;\n }\n}\n\nexport async function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(\n ctx as Parameters<typeof getCurrentUserId>[0],\n );\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking belief mutations.\",\n });\n }\n return userId;\n}\n\nexport async function requireProjectWriteAccess(\n ctx: { db: unknown },\n projectId: string,\n userId: string,\n): Promise<void> {\n const hasAccess = await checkProjectAccess(\n ctx as Parameters<typeof checkProjectAccess>[0],\n projectId,\n userId,\n );\n if (!hasAccess) {\n throwStructuredMutationError({\n message: \"Project access required.\",\n status: 403,\n code: \"FORBIDDEN\",\n invariantCode: \"policy.scope_required\",\n suggestion: \"Request write access for the project and retry.\",\n details: { projectId, userId },\n });\n }\n}\n","/** Split confidence operations out of epistemicBeliefs.ts. */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport {\n buildBeliefConfidenceRow,\n deriveTupleContradictionSeverity,\n formatTupleContradictionDescription,\n getActiveConfidencePolicy,\n hasCompletedWorktreeForBelief,\n readBeliefOpinionSnapshot,\n readTupleContradictedFlag,\n resolveBeliefStatus,\n throwStructuredMutationError,\n requireProjectWriteAccess,\n type BeliefConfidenceTrigger,\n} from \"./epistemicBeliefs.helpers\";\n\nexport async function applyBeliefConfidenceChange(\n ctx: MutationCtx,\n args: {\n nodeId: Id<\"epistemicNodes\">;\n // SL opinion — the ONLY confidence input (EK-7)\n belief: number; // b: evidence FOR [0,1]\n disbelief: number; // d: evidence AGAINST [0,1]\n uncertainty: number; // u: lack of evidence [0,1]\n baseRate?: number; // a: prior probability [0,1], defaults to 0.5\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n authenticatedUserId: string;\n slOperator?: SLOperator; // which SL operator produced this opinion\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringWorktreeId?: string;\n },\n): Promise<{\n nodeId: Id<\"epistemicNodes\">;\n previousConfidence: number;\n newConfidence: number;\n opinion: { b: number; d: number; u: number; a: number };\n beliefConfidenceId: Id<\"beliefConfidence\">;\n}> {\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Node not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n invariantCode: \"belief.exists\",\n suggestion:\n \"Verify nodeId points to an existing node before modulating confidence.\",\n details: { nodeId: args.nodeId },\n });\n }\n if (node.nodeType !== \"belief\") {\n throwStructuredMutationError({\n message: `modulateConfidence only applies to belief nodes. Received nodeType \"${node.nodeType}\". Entity nodes (company, person, investor, etc.) do not have confidence — use entityLifecycle.updateEntityAttributes for mutable entity data.`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"entity.no_confidence\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes for entity mutations. modulateConfidence is for belief nodes only.\",\n details: { nodeId: args.nodeId, nodeType: node.nodeType },\n });\n }\n if (!node.projectId) {\n throwStructuredMutationError({\n message: \"Belief has no project scope.\",\n status: 400,\n code: \"MISSING_SCOPE\",\n invariantCode: \"belief.project_required\",\n suggestion: \"Belief must have a projectId to modulate confidence.\",\n details: { nodeId: args.nodeId },\n });\n }\n await requireProjectWriteAccess(\n ctx,\n node.projectId,\n args.authenticatedUserId,\n );\n\n const existingMetadata = (node.metadata || {}) as Record<string, unknown>;\n const currentBeliefStatus = resolveBeliefStatus(node, existingMetadata);\n const confidencePolicy = await getActiveConfidencePolicy(ctx);\n if (\n confidencePolicy.scoringMode === \"after_worktree\" &&\n isPreValidationBeliefStatus(currentBeliefStatus)\n ) {\n const hasCompletedWorktree = await hasCompletedWorktreeForBelief(\n ctx,\n args.nodeId,\n );\n if (!hasCompletedWorktree) {\n throwStructuredMutationError({\n message:\n \"Cannot score belief before worktree completion. Complete a worktree that tests this belief first.\",\n status: 409,\n code: \"CONFLICT\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Complete a worktree linked to this belief before recording confidence modulation.\",\n details: { nodeId: args.nodeId },\n });\n }\n }\n\n const previousConfidence = node.confidence || 0.5;\n const predictionMeta =\n (node as any).predictionMeta || existingMetadata.predictionMeta;\n const previousOpinion = readBeliefOpinionSnapshot(node, existingMetadata);\n\n // SL opinion — the only path (EK-7)\n const slB = args.belief;\n const slD = args.disbelief;\n const slU = args.uncertainty;\n const slA = args.baseRate ?? 0.5;\n const nextOpinion = { b: slB, d: slD, u: slU, a: slA };\n const derivedConfidence = confidenceFromSL(slB, slD, slU, slA);\n const isFirstScoring =\n typeof node.confidence !== \"number\" || !Number.isFinite(node.confidence);\n const previousTupleContradicted =\n readTupleContradictedFlag((node as any).tupleContradicted) ??\n readTupleContradictedFlag(existingMetadata.tupleContradicted) ??\n detectTupleContradiction(\n previousOpinion,\n confidencePolicy.tupleContradiction.beliefThreshold,\n confidencePolicy.tupleContradiction.disbeliefThreshold,\n );\n const tupleTransition = evaluateTupleContradictionTransition({\n previousTupleContradicted,\n opinion: nextOpinion,\n policy: confidencePolicy.tupleContradiction,\n });\n const tupleContradictionDescription = formatTupleContradictionDescription({\n opinion: nextOpinion,\n policy: tupleTransition.policy,\n });\n\n const newBeliefStatus = promoteBeliefStatusAfterScoring(currentBeliefStatus, {\n confidence: derivedConfidence,\n predictionMeta,\n metadata: existingMetadata,\n });\n\n let tupleContradictionId: Id<\"contradictions\"> | undefined;\n if (tupleTransition.crossedIntoTupleContradiction) {\n tupleContradictionId = (await ctx.runMutation(\n \"contradictions:create\" as any,\n {\n projectId: node.projectId,\n topicId: node.topicId as any,\n beliefId: args.nodeId,\n beliefBId: args.nodeId,\n supportingInsightIds: [],\n contradictingInsightIds: [],\n severity: deriveTupleContradictionSeverity(node),\n source: \"tuple_space\",\n detectionMethod: \"agent\",\n description: tupleContradictionDescription,\n createdBy: args.authenticatedUserId,\n },\n )) as Id<\"contradictions\">;\n }\n\n await ctx.db.patch(args.nodeId, {\n confidence: derivedConfidence,\n beliefStatus: newBeliefStatus,\n tupleContradicted: tupleTransition.tupleContradicted,\n updatedAt: now,\n // Store SL opinion fields at node level for fast access\n opinion_b: slB,\n opinion_d: slD,\n opinion_u: slU,\n opinion_a: slA,\n metadata: {\n ...existingMetadata,\n beliefStatus: newBeliefStatus,\n slBelief: slB,\n slDisbelief: slD,\n slUncertainty: slU,\n slBaseRate: slA,\n tupleContradicted: tupleTransition.tupleContradicted,\n },\n } as any);\n\n if (isFirstScoring) {\n const nodeTopicId = node.topicId;\n const themeNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic\", (q: any) =>\n q.eq(\"topicId\", nodeTopicId || node.projectId),\n )\n .filter((q) => q.eq(q.field(\"nodeType\"), \"theme\"))\n .collect();\n\n for (const theme of themeNodes) {\n if (theme.globalId && node.globalId) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: `edge-${node.globalId}-relates_to_thesis-${theme.globalId}`,\n fromGlobalId: node.globalId,\n toGlobalId: theme.globalId,\n edgeType: \"relates_to_thesis\",\n weight: derivedConfidence,\n createdBy: args.authenticatedUserId,\n topicId: String(node.projectId),\n fromNodeType: \"belief\",\n toNodeType: \"theme\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n }\n\n const storedRationale =\n args.rationale ??\n `Confidence changed from ${previousConfidence.toFixed(2)} (nodeId: ${args.nodeId})`;\n\n const beliefConfidenceId = (await ctx.db.insert(\"beliefConfidence\", {\n ...buildBeliefConfidenceRow({\n beliefId: args.nodeId as Id<\"epistemicNodes\">,\n belief: slB,\n disbelief: slD,\n uncertainty: slU,\n baseRate: slA,\n trigger: args.trigger,\n rationale: storedRationale,\n assessedBy: args.authenticatedUserId,\n assessedAt: now,\n slOperator: args.slOperator,\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringContradictionId: tupleContradictionId,\n triggeringWorktreeId: args.triggeringWorktreeId,\n }),\n } as any)) as Id<\"beliefConfidence\">;\n\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: args.nodeId,\n changeType: \"confidence_changed\",\n previousState: {\n confidence: previousConfidence,\n tupleContradicted: previousTupleContradicted,\n },\n newState: {\n opinion: nextOpinion,\n confidence: derivedConfidence,\n trigger: args.trigger,\n rationale: storedRationale,\n tupleContradicted: tupleTransition.tupleContradicted,\n tupleContradictionPolicy: tupleTransition.policy,\n ...(tupleContradictionId\n ? { tupleContradictionId: String(tupleContradictionId) }\n : {}),\n },\n changedBy: args.authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: node.projectId,\n topicId: node.topicId,\n });\n\n if (\n tupleTransition.crossedIntoTupleContradiction ||\n tupleTransition.crossedOutOfTupleContradiction\n ) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: args.nodeId,\n changeType: \"updated\",\n previousState: { tupleContradicted: previousTupleContradicted },\n newState: {\n tupleContradicted: tupleTransition.tupleContradicted,\n action: tupleTransition.crossedIntoTupleContradiction\n ? \"tuple_contradiction_detected\"\n : \"tuple_contradiction_cleared\",\n opinion: nextOpinion,\n tupleContradictionPolicy: tupleTransition.policy,\n ...(tupleContradictionId\n ? { tupleContradictionId: String(tupleContradictionId) }\n : {}),\n },\n rationale: tupleTransition.crossedIntoTupleContradiction\n ? tupleContradictionDescription\n : `Tuple-space contradiction cleared: b=${nextOpinion.b.toFixed(2)}, d=${nextOpinion.d.toFixed(2)} no longer exceed the configured policy thresholds.`,\n changedBy: args.authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: node.projectId,\n topicId: node.topicId,\n });\n }\n\n if (Math.abs(derivedConfidence - previousConfidence) >= 0.15) {\n await ctx.scheduler.runAfter(\n 5000,\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: args.nodeId as string,\n projectId: node.projectId,\n },\n );\n }\n\n // WT-4: Re-evaluate publication rules after confidence changes.\n // Publication is visibility-based: rules auto-determine which workspace\n // nodes are exposed at tenant scope based on confidence thresholds, etc.\n if (node.workspaceId && node.tenantId) {\n await ctx.scheduler.runAfter(\n 0,\n (internal as any).publication.evaluateNodePublication,\n { nodeId: args.nodeId },\n );\n }\n\n return {\n nodeId: args.nodeId,\n previousConfidence,\n newConfidence: derivedConfidence,\n opinion: { b: slB, d: slD, u: slU, a: slA },\n beliefConfidenceId,\n };\n}\n\nfunction propagationTriggerForEdge(\n edgeType: string,\n weight: number,\n): BeliefConfidenceTrigger {\n if (edgeType === \"contradicts\" || edgeType === \"refutes\") {\n return \"contradiction_detected\";\n }\n\n if ((edgeType === \"supports\" || edgeType === \"informs\") && weight < 0) {\n return \"contradiction_detected\";\n }\n\n return \"evidence_added\";\n}\n\n// =============================================================================\n// SL PROPAGATION — EDGE-DEFINED OPINION PROPAGATION (EK-7, LKC-5)\n// =============================================================================\n\n/**\n * Propagate a confidence change through graph edges whose specs allow it.\n *\n * After a belief is scored, this function:\n * 1. Reads the graph-primitives edge propagation specs\n * 2. Traverses matching incoming/outgoing/bidirectional edges hop by hop\n * 3. Applies the edge operator with per-hop damping and hop limits\n * 4. Writes propagated opinions as new beliefConfidence entries\n */\nexport const propagateConfidenceChange = internalMutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n opinion_b: v.number(),\n opinion_d: v.number(),\n opinion_u: v.number(),\n opinion_a: v.number(),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const sourceOpinion = mkOpinion(\n args.opinion_b,\n args.opinion_d,\n args.opinion_u,\n args.opinion_a,\n );\n\n const sourceNode = await ctx.db.get(args.nodeId);\n const sourceScope = await resolveNodeScopeForWorkspaceIsolation(\n ctx,\n sourceNode,\n );\n const dispatches = await collectConfidencePropagationDispatches({\n sourceNodeId: args.nodeId,\n sourceOpinion,\n sourceScope,\n queryEdges: async ({ nodeId, spec, direction }) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\n direction === \"outgoing\" ? \"by_from_type\" : \"by_to_type\",\n (q: any) =>\n direction === \"outgoing\"\n ? q.eq(\"fromNodeId\", nodeId).eq(\"edgeType\", spec.edgeType)\n : q.eq(\"toNodeId\", nodeId).eq(\"edgeType\", spec.edgeType),\n )\n .collect();\n },\n getNode: async (nodeId) => await ctx.db.get(nodeId),\n });\n\n for (const dispatch of dispatches) {\n await applyBeliefConfidenceChange(ctx, {\n nodeId: dispatch.targetNodeId,\n belief: dispatch.opinion.b,\n disbelief: dispatch.opinion.d,\n uncertainty: dispatch.opinion.u,\n baseRate: dispatch.opinion.a,\n trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),\n rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,\n authenticatedUserId: args.userId,\n slOperator: dispatch.operator as SLOperator,\n });\n }\n\n return {\n propagated: dispatches.map((dispatch) => ({\n targetNodeId: String(dispatch.targetNodeId),\n edgeType: dispatch.edgeType,\n operator: dispatch.operator,\n })),\n count: dispatches.length,\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/beliefLifecycle.ts","../src/convex.ts","../src/edges/contains.ts","../src/edges/utils.ts","../src/edges/contradicts.ts","../src/edges/dependsOn.ts","../src/edges/derivedFrom.ts","../src/edges/elaborates.ts","../src/edges/informs.ts","../src/edges/propagationTypes.ts","../src/edges/refutes.ts","../src/edges/supports.ts","../src/edges/tests.ts","../src/edges/index.ts","../src/debug.ts","../src/topicScope.ts","../src/workspaceIsolation.ts","../src/confidencePropagationDispatch.ts","../src/epistemicBeliefs.helpers.ts","../src/epistemicBeliefs.confidence.ts"],"names":["project","normalizeScopeValue","mkOpinion","v","readOpinionFromRecord","confidenceFromSL","detectTupleContradiction","evaluateTupleContradictionTransition"],"mappings":"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","file":"epistemicBeliefs.confidence.js","sourcesContent":["/**\n * Belief lifecycle helpers shared across Convex modules.\n *\n * Canonical lifecycle:\n * assumption -> hypothesis -> active -> resolved_true/resolved_false\n * \\-> superseded\n */\n\nexport type BeliefLifecycleStatus =\n | \"assumption\"\n | \"hypothesis\"\n | \"active\"\n | \"superseded\"\n | \"resolved_true\"\n | \"resolved_false\";\n\ntype PredictionOutcome =\n | \"pending\"\n | \"confirmed\"\n | \"disconfirmed\"\n | \"partial\"\n | \"expired\";\n\nconst BELIEF_STATUS_VALUES: readonly BeliefLifecycleStatus[] = [\n \"assumption\",\n \"hypothesis\",\n \"active\",\n \"superseded\",\n \"resolved_true\",\n \"resolved_false\",\n];\n\nconst RESOLVED_PREDICTION_OUTCOMES: readonly PredictionOutcome[] = [\n \"confirmed\",\n \"disconfirmed\",\n \"partial\",\n \"expired\",\n];\n\nexport function isBeliefLifecycleStatus(\n value: unknown\n): value is BeliefLifecycleStatus {\n return (\n typeof value === \"string\" &&\n BELIEF_STATUS_VALUES.includes(value as BeliefLifecycleStatus)\n );\n}\n\nfunction normalizeLegacyBeliefStatus(\n value: unknown\n): BeliefLifecycleStatus | null {\n if (isBeliefLifecycleStatus(value)) {\n return value;\n }\n if (value === \"belief\" || value === \"established\" || value === \"emerging\") {\n return \"active\";\n }\n if (value === \"fact\" || value === \"confirmed\") {\n return \"resolved_true\";\n }\n if (value === \"disconfirmed\" || value === \"expired\") {\n return \"resolved_false\";\n }\n if (value === \"deprecated\") {\n return \"superseded\";\n }\n return null;\n}\n\nfunction normalizeBeliefConfidence(confidence: unknown): number | null {\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n if (confidence >= 0 && confidence <= 1) {\n return confidence;\n }\n // Backward compatibility with historical percentage-scale confidence (0-100).\n if (confidence > 1 && confidence <= 100) {\n return confidence / 100;\n }\n return null;\n}\n\nexport function isResolvedByConfidence(confidence: unknown): boolean {\n const normalized = normalizeBeliefConfidence(confidence);\n if (normalized === null) {\n return false;\n }\n return normalized <= 0 || normalized >= 1;\n}\n\nexport function hasResolvedPredictionOutcome(predictionMeta: unknown): boolean {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return false;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n return (\n typeof outcome === \"string\" &&\n RESOLVED_PREDICTION_OUTCOMES.includes(outcome as PredictionOutcome)\n );\n}\n\nfunction getPredictionMetaFromMetadata(\n metadata: Record<string, unknown> | undefined\n): unknown {\n return metadata?.predictionMeta;\n}\n\nexport function shouldTreatBeliefAsFact(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (isResolvedByConfidence(opts.confidence)) {\n return true;\n }\n if (hasResolvedPredictionOutcome(opts.predictionMeta)) {\n return true;\n }\n if (\n hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))\n ) {\n return true;\n }\n return false;\n}\n\nfunction resolvedPredictionStatus(\n predictionMeta: unknown\n): BeliefLifecycleStatus | null {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return null;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n if (outcome === \"confirmed\") {\n return \"resolved_true\";\n }\n if (outcome === \"disconfirmed\" || outcome === \"expired\") {\n return \"resolved_false\";\n }\n return null;\n}\n\nfunction shouldTreatBeliefAsResolved(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus | null {\n if (isResolvedByConfidence(opts.confidence)) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n return normalized === 0 ? \"resolved_false\" : \"resolved_true\";\n }\n const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);\n if (directPredictionStatus) {\n return directPredictionStatus;\n }\n const metadataPredictionStatus = resolvedPredictionStatus(\n getPredictionMetaFromMetadata(opts.metadata)\n );\n if (metadataPredictionStatus) {\n return metadataPredictionStatus;\n }\n return null;\n}\n\nexport function resolveBeliefLifecycleStatus(opts: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved(opts);\n if (resolvedStatus) {\n return resolvedStatus;\n }\n\n const direct = opts.beliefStatus;\n const normalizedDirect = normalizeLegacyBeliefStatus(direct);\n if (normalizedDirect) {\n // If the belief has been scored (has numeric credence) but stored status\n // is still pre-validation, promote to active. Evidence, not user intent,\n // makes a hypothesis active.\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedDirect)\n ) {\n return \"active\";\n }\n return normalizedDirect;\n }\n\n const metaStatus = opts.metadata?.beliefStatus;\n const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);\n if (normalizedMetaStatus) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedMetaStatus)\n ) {\n return \"active\";\n }\n return normalizedMetaStatus;\n }\n\n return \"assumption\";\n}\n\nexport function isPreValidationBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"assumption\" || status === \"hypothesis\";\n}\n\nexport function isPropagationEligibleBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"active\" || status === \"resolved_true\";\n}\n\nexport function promoteBeliefStatusAfterScoring(\n status: BeliefLifecycleStatus,\n opts?: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n }\n): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved({ ...opts });\n if (resolvedStatus) {\n return resolvedStatus;\n }\n if (isPreValidationBeliefStatus(status)) {\n return \"active\";\n }\n return status;\n}\n\nexport function promoteBeliefStatusAfterEvidence(\n status: BeliefLifecycleStatus\n): BeliefLifecycleStatus {\n return isPreValidationBeliefStatus(status) ? \"active\" : status;\n}\n","import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const containsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contains\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Structural containment only. Traversed for explicit semantics, but it never propagates opinions.\",\n};\n\n","import {\n applyNegativeEvidence,\n applyNegativeSupport,\n cumulativeFusion,\n project,\n trustDiscount,\n type EdgeMetadata,\n type PropagationResult,\n type SLOpinion,\n} from \"@lucern/confidence\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n} from \"./propagationTypes\";\n\nexport function readEdgeMetadata<TNodeId extends string>(\n edge: PropagationEdgeRecord<TNodeId>\n): EdgeMetadata {\n return {\n constraint: edge.constraint ?? undefined,\n normalization: edge.normalization ?? undefined,\n propagation: edge.propagation ?? undefined,\n conditionalA: edge.conditionalA ?? undefined,\n conditionalNotA: edge.conditionalNotA ?? undefined,\n };\n}\n\nexport function applyPerHopDamping(\n sourceOpinion: SLOpinion,\n damping: number\n): SLOpinion {\n if (damping >= 1) {\n return sourceOpinion;\n }\n\n return trustDiscount(sourceOpinion, Math.max(0, damping));\n}\n\nexport function annotateRationale(\n result: PropagationResult,\n spec: EdgePropagationSpec,\n hop: number\n): PropagationResult {\n return {\n ...result,\n rationale: `hop=${hop} edge=${spec.edgeType} damping=${spec.damping.toFixed(\n 2\n )} :: ${result.rationale}`,\n };\n}\n\nexport function propagatePositiveSupport(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(\n 2\n )}) from source at ${project(sourceOpinion).toFixed(2)}`,\n };\n}\n\nexport function propagatePositiveInform(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number\n): PropagationResult {\n const discounted = trustDiscount(sourceOpinion, Math.abs(edgeWeight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${edgeWeight.toFixed(2)})`,\n };\n}\n\nexport function propagateNegativeSupportWithMetadata(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number,\n edge: PropagationEdgeRecord\n): PropagationResult {\n return applyNegativeSupport(\n sourceOpinion,\n targetOpinion,\n edgeWeight,\n readEdgeMetadata(edge)\n );\n}\n\nexport const propagateNegativeInform = applyNegativeEvidence;\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n} from \"./utils\";\n\nexport const contradictsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"contradicts\",\n direction: \"bidirectional\",\n transitivity: \"none\",\n damping: 0.85,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n negativeWeight,\n edge\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Legacy contradiction edges move negative pressure in either direction, but never beyond one hop.\",\n};\n\n","import {\n conditionalDeduction,\n dampedDependencyCascade,\n mkOpinion,\n project,\n} from \"@lucern/confidence\";\nimport type { EdgePropagationSpec } from \"./propagationTypes\";\nimport { annotateRationale, applyPerHopDamping, readEdgeMetadata } from \"./utils\";\n\nexport const dependsOnPropagationSpec: EdgePropagationSpec = {\n edgeType: \"depends_on\",\n direction: \"incoming\",\n transitivity: \"damped\",\n damping: 0.8,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const metadata = readEdgeMetadata(edge);\n\n if (metadata.conditionalA && metadata.conditionalNotA) {\n const deducedOpinion = conditionalDeduction(\n dampedSource,\n mkOpinion(\n metadata.conditionalA.b,\n metadata.conditionalA.d,\n metadata.conditionalA.u,\n metadata.conditionalA.a\n ),\n mkOpinion(\n metadata.conditionalNotA.b,\n metadata.conditionalNotA.d,\n metadata.conditionalNotA.u,\n metadata.conditionalNotA.a\n ),\n targetOpinion.a\n );\n\n return annotateRationale(\n {\n opinion: deducedOpinion,\n operator: \"conditional_deduction\",\n rationale: `Conditional deduction: prerequisite at ${project(\n dampedSource\n ).toFixed(2)}`,\n },\n context.spec,\n context.hop\n );\n }\n\n const result = dampedDependencyCascade(\n dampedSource,\n targetOpinion,\n metadata.propagation ?? \"continuous\"\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Structural gating. Textbook conditional deduction when edge conditionals exist, otherwise damped dependency cascade through downstream chains.\",\n};\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const derivedFromPropagationSpec: EdgePropagationSpec = {\n edgeType: \"derived_from\",\n direction: \"incoming\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Provenance only. The traversal surface stays explicit, but confidence does not move across derived_from edges.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const elaboratesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"elaborates\",\n direction: \"outgoing\",\n transitivity: \"damped\",\n damping: 0.7,\n maxHops: 2,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const contextualWeight = Math.min(Math.abs(edge.weight ?? 0.35), 0.35);\n const result = propagatePositiveInform(\n dampedSource,\n targetOpinion,\n contextualWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Context-rich supporting detail. Elaborates carries a small positive effect with short, damped chaining.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n propagatePositiveInform,\n} from \"./utils\";\n\nexport const informsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"informs\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.92,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeInform(dampedSource, targetOpinion, weight)\n : propagatePositiveInform(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Evidence-bearing influence. Informs can chain through the graph with light per-hop damping.\",\n};\n\n","import type {\n EdgeMetadata,\n PropagationResult,\n SLOpinion,\n} from \"@lucern/confidence\";\n\nexport type PropagationTraversalDirection = \"outgoing\" | \"incoming\";\n\nexport type PropagationSpecDirection =\n | PropagationTraversalDirection\n | \"bidirectional\";\n\nexport type PropagationEdgeType =\n | \"supports\"\n | \"depends_on\"\n | \"informs\"\n | \"contains\"\n | \"tests\"\n | \"derived_from\"\n | \"contradicts\"\n | \"refutes\"\n | \"elaborates\";\n\nexport type PropagationEdgeRecord<TNodeId extends string = string> = {\n fromNodeId?: TNodeId | null;\n toNodeId?: TNodeId | null;\n edgeType: string;\n weight?: number | null;\n constraint?: EdgeMetadata[\"constraint\"] | null;\n normalization?: EdgeMetadata[\"normalization\"] | null;\n propagation?: EdgeMetadata[\"propagation\"] | null;\n conditionalA?: EdgeMetadata[\"conditionalA\"] | null;\n conditionalNotA?: EdgeMetadata[\"conditionalNotA\"] | null;\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type EdgePropagationSpec<TNodeId extends string = string> = {\n edgeType: PropagationEdgeType;\n direction: PropagationSpecDirection;\n transitivity: \"none\" | \"damped\" | \"full\";\n damping: number;\n maxHops: number | \"unbounded\";\n operator: (\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edge: PropagationEdgeRecord<TNodeId>,\n context: {\n hop: number;\n sourceNodeId: TNodeId;\n targetNodeId: TNodeId;\n traversedDirection: PropagationTraversalDirection;\n spec: EdgePropagationSpec<TNodeId>;\n }\n ) => PropagationResult | null;\n description: string;\n};\n\nexport function isPropagationTraversalDirection(\n direction: string\n): direction is PropagationTraversalDirection {\n return direction === \"outgoing\" || direction === \"incoming\";\n}\n\nexport function canTraverseHop<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n nextHop: number\n): boolean {\n return spec.maxHops === \"unbounded\" || nextHop <= spec.maxHops;\n}\n\nexport function canContinueTransitively<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n currentHop: number\n): boolean {\n if (spec.transitivity === \"none\") {\n return false;\n }\n\n return spec.maxHops === \"unbounded\" || currentHop < spec.maxHops;\n}\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n} from \"./utils\";\n\nexport const refutesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"refutes\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 0.9,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeInform(\n dampedSource,\n targetOpinion,\n negativeWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Explicit negative evidence semantics. Refutes is treated as strong one-hop counter-evidence.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n propagatePositiveSupport,\n} from \"./utils\";\n\nexport const supportsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"supports\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.85,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n weight,\n edge\n )\n : propagatePositiveSupport(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Belief-to-belief influence. Supports chains transitively with moderate per-hop damping.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const testsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"tests\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Interrogation linkage only. Tests edges do not directly move confidence.\",\n};\n\n","import { containsPropagationSpec } from \"./contains\";\nimport { contradictsPropagationSpec } from \"./contradicts\";\nimport { dependsOnPropagationSpec } from \"./dependsOn\";\nimport { derivedFromPropagationSpec } from \"./derivedFrom\";\nimport { elaboratesPropagationSpec } from \"./elaborates\";\nimport { informsPropagationSpec } from \"./informs\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport { refutesPropagationSpec } from \"./refutes\";\nimport { supportsPropagationSpec } from \"./supports\";\nimport { testsPropagationSpec } from \"./tests\";\n\nexport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nexport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\n\nexport const EDGE_PROPAGATION_SPECS: readonly EdgePropagationSpec[] = [\n supportsPropagationSpec,\n informsPropagationSpec,\n dependsOnPropagationSpec,\n derivedFromPropagationSpec,\n containsPropagationSpec,\n testsPropagationSpec,\n contradictsPropagationSpec,\n refutesPropagationSpec,\n elaboratesPropagationSpec,\n] as const;\n\nconst EDGE_PROPAGATION_SPEC_MAP = new Map<\n PropagationEdgeType,\n EdgePropagationSpec\n>(EDGE_PROPAGATION_SPECS.map((spec) => [spec.edgeType, spec]));\n\nexport function getEdgePropagationSpec(\n edgeType: string\n): EdgePropagationSpec | undefined {\n return EDGE_PROPAGATION_SPEC_MAP.get(edgeType as PropagationEdgeType);\n}\n\nexport function getEdgePropagationSpecs(): readonly EdgePropagationSpec[] {\n return EDGE_PROPAGATION_SPECS;\n}\n\nexport function getTraversalDirections(\n direction: PropagationSpecDirection\n): readonly PropagationTraversalDirection[] {\n if (isPropagationTraversalDirection(direction)) {\n return [direction];\n }\n\n return [\"outgoing\", \"incoming\"];\n}\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\n};\n\nexport function normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction throwWorkspaceIsolationError(args: {\n message: string;\n invariantCode: string;\n suggestion: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = 409;\n error.code = \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function assertWorkspaceScopedEpistemicNodeScope(args: {\n scope: TopicProjectScope;\n nodeType: string;\n mutationName: string;\n}): void {\n const layer = isNodeType(args.nodeType)\n ? getLayerForNodeType(args.nodeType)\n : undefined;\n if (layer === \"ontological\") {\n return;\n }\n\n const workspaceId = normalizeScopeValue(args.scope.workspaceId);\n if (workspaceId) {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n \"Workspace-scoped reasoning isolation requires workspaceId on non-ontological node creation.\",\n invariantCode: \"workspace.scope_required_for_epistemic_nodes\",\n suggestion:\n \"Resolve the topic/project scope through a workspace-bound topic before creating epistemic nodes.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n topicId: args.scope.topicId,\n projectId: args.scope.projectId,\n },\n });\n}\n\nexport function nodeMatchesWorkspaceReasoningScope(\n node: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!node) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const nodeTenantId = normalizeScopeValue(node.tenantId);\n const nodeWorkspaceId = normalizeScopeValue(node.workspaceId);\n const epistemicLayer =\n typeof node.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n\n if (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\n return false;\n }\n\n // Ontological entities are tenant-global (no workspace required)\n if (epistemicLayer === \"ontological\" && nodeWorkspaceId === undefined) {\n return true;\n }\n\n // Published nodes are visible at tenant scope — the microservice API surface.\n // The node stays in its workspace, but tenant-scope queries can see it.\n if (!scopeWorkspaceId && node.publicationStatus === \"published\") {\n return true;\n }\n\n if (!scopeWorkspaceId) {\n return nodeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === nodeWorkspaceId;\n}\n\nexport function edgeMatchesWorkspaceReasoningScope(\n edge: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!edge) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const edgeTenantId = normalizeScopeValue(edge.tenantId);\n const edgeWorkspaceId = normalizeScopeValue(edge.workspaceId);\n\n if (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\n return false;\n }\n\n if (!scopeWorkspaceId) {\n return edgeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === edgeWorkspaceId;\n}\n\nexport async function resolveNodeScopeForWorkspaceIsolation(\n ctx: any,\n node: ScopeLike | null | undefined\n): Promise<{\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n nodeType?: string;\n}> {\n const epistemicLayer =\n typeof node?.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n const resolved = {\n tenantId: normalizeScopeValue(node?.tenantId),\n workspaceId: normalizeScopeValue(node?.workspaceId),\n epistemicLayer,\n nodeType: typeof node?.nodeType === \"string\" ? node.nodeType : undefined,\n };\n\n if (!node) {\n return resolved;\n }\n\n if (resolved.epistemicLayer === \"ontological\") {\n return resolved;\n }\n\n if (resolved.tenantId || resolved.workspaceId) {\n return resolved;\n }\n\n if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n if (node.projectId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n projectId: String(node.projectId),\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n return resolved;\n}\n\nexport function resolveRuntimePackMutationContext(args: {\n runtimeToolName?: string;\n runtimePackKey?: string;\n runtimePackInstallScope?: \"tenant\" | \"workspace\";\n}): RuntimePackMutationContext | undefined {\n if (\n !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\n ) {\n return;\n }\n\n return {\n toolName: args.runtimeToolName,\n packKey: args.runtimePackKey,\n packInstallScope: args.runtimePackInstallScope,\n };\n}\n\nexport function assertTenantPackWorkspaceMutationAllowed(args: {\n runtime?: RuntimePackMutationContext;\n target: ScopeLike;\n mutationName: string;\n}): void {\n if (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\n return;\n }\n\n const targetWorkspaceId = normalizeScopeValue(args.target.workspaceId);\n const targetLayer =\n typeof args.target.epistemicLayer === \"string\"\n ? args.target.epistemicLayer\n : undefined;\n\n if (!targetWorkspaceId || targetLayer === \"ontological\") {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n `Tenant-scoped pack \"${args.runtime.packKey}\" cannot mutate workspace-scoped reasoning state.`,\n invariantCode: \"workspace.tenant_pack_reasoning_write_forbidden\",\n suggestion:\n \"Use a workspace-scoped pack for workspace-local graph mutations, or route the change through tenant-global canonical entity flows.\",\n details: {\n mutationName: args.mutationName,\n toolName: args.runtime.toolName,\n packKey: args.runtime.packKey,\n targetWorkspaceId,\n targetNodeType: args.target.nodeType,\n targetLayer,\n },\n });\n}\n","import {\n hasProjectedOpinionChanged,\n mkOpinion,\n readOpinionFromRecord,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n getEdgePropagationSpecs,\n getTraversalDirections,\n type EdgePropagationSpec,\n type PropagationEdgeRecord,\n type PropagationEdgeType,\n type PropagationTraversalDirection,\n} from \"./edges\";\nimport {\n edgeMatchesWorkspaceReasoningScope,\n nodeMatchesWorkspaceReasoningScope,\n} from \"./workspaceIsolation\";\n\nexport type PropagationDispatchScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type PropagationDispatchNode<TNodeId extends string = string> = {\n _id?: TNodeId;\n nodeType?: string;\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n publicationStatus?: string;\n metadata?: unknown;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n opinion_a?: number;\n};\n\nexport type PropagationDispatchEdge<TNodeId extends string = string> =\n PropagationEdgeRecord<TNodeId>;\n\nexport type ConfidencePropagationDispatch<TNodeId extends string = string> = {\n targetNodeId: TNodeId;\n edgeType: PropagationEdgeType;\n traversedDirection: PropagationTraversalDirection;\n weight: number;\n opinion: SLOpinion;\n operator: SLOperator;\n rationale: string;\n hop: number;\n};\n\nfunction resolveTraversalTargetNodeId<TNodeId extends string>(\n edge: PropagationDispatchEdge<TNodeId>,\n direction: PropagationTraversalDirection\n): TNodeId | undefined {\n const targetNodeId =\n direction === \"outgoing\" ? edge.toNodeId : edge.fromNodeId;\n return targetNodeId ?? undefined;\n}\n\nfunction readNodeOpinion<TNodeId extends string>(\n node: PropagationDispatchNode<TNodeId>\n): SLOpinion {\n const metadata = (node.metadata ?? {}) as Record<string, unknown>;\n\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch {\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport async function collectConfidencePropagationDispatches<\n TNodeId extends string = string,\n>(args: {\n sourceNodeId: TNodeId;\n sourceOpinion: SLOpinion;\n sourceScope?: PropagationDispatchScope;\n traversalSpecs?: readonly EdgePropagationSpec<TNodeId>[];\n queryEdges: (args: {\n nodeId: TNodeId;\n spec: EdgePropagationSpec<TNodeId>;\n direction: PropagationTraversalDirection;\n hop: number;\n }) => Promise<ReadonlyArray<PropagationDispatchEdge<TNodeId>>>;\n getNode: (\n nodeId: TNodeId\n ) => Promise<PropagationDispatchNode<TNodeId> | null | undefined>;\n}): Promise<ConfidencePropagationDispatch<TNodeId>[]> {\n const dispatchesByTargetId = new Map<\n string,\n ConfidencePropagationDispatch<TNodeId>\n >();\n const opinionCache = new Map<string, SLOpinion>();\n const nodeCache = new Map<\n string,\n PropagationDispatchNode<TNodeId> | null | undefined\n >();\n const traversalSpecs = (args.traversalSpecs ??\n getEdgePropagationSpecs()) as readonly EdgePropagationSpec<TNodeId>[];\n const queue: Array<{\n nodeId: TNodeId;\n opinion: SLOpinion;\n hop: number;\n visitedNodeIds: Set<string>;\n }> = [\n {\n nodeId: args.sourceNodeId,\n opinion: args.sourceOpinion,\n hop: 0,\n visitedNodeIds: new Set([String(args.sourceNodeId)]),\n },\n ];\n\n const loadNode = async (nodeId: TNodeId) => {\n const cacheKey = String(nodeId);\n if (!nodeCache.has(cacheKey)) {\n nodeCache.set(cacheKey, await args.getNode(nodeId));\n }\n return nodeCache.get(cacheKey) ?? null;\n };\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) {\n continue;\n }\n\n for (const spec of traversalSpecs) {\n const nextHop = state.hop + 1;\n if (!canTraverseHop(spec, nextHop)) {\n continue;\n }\n\n for (const direction of getTraversalDirections(spec.direction)) {\n const edges = await args.queryEdges({\n nodeId: state.nodeId,\n spec,\n direction,\n hop: nextHop,\n });\n\n for (const edge of edges) {\n if (\n args.sourceScope &&\n !edgeMatchesWorkspaceReasoningScope(edge, args.sourceScope)\n ) {\n continue;\n }\n\n const targetNodeId = resolveTraversalTargetNodeId(edge, direction);\n if (!targetNodeId) {\n continue;\n }\n\n if (state.visitedNodeIds.has(String(targetNodeId))) {\n continue;\n }\n\n const targetNode = await loadNode(targetNodeId);\n if (!targetNode || targetNode.nodeType !== \"belief\") {\n continue;\n }\n\n if (\n args.sourceScope &&\n !nodeMatchesWorkspaceReasoningScope(targetNode, args.sourceScope)\n ) {\n continue;\n }\n\n const cacheKey = String(targetNodeId);\n const targetOpinion =\n opinionCache.get(cacheKey) ?? readNodeOpinion(targetNode);\n const result = spec.operator(state.opinion, targetOpinion, edge, {\n hop: nextHop,\n sourceNodeId: state.nodeId,\n targetNodeId,\n traversedDirection: direction,\n spec,\n });\n\n if (\n !result ||\n !hasProjectedOpinionChanged(targetOpinion, result.opinion)\n ) {\n continue;\n }\n\n const projectedOpinion = mkOpinion(\n result.opinion.b,\n result.opinion.d,\n result.opinion.u,\n result.opinion.a\n );\n\n opinionCache.set(cacheKey, projectedOpinion);\n\n const existingDispatch = dispatchesByTargetId.get(cacheKey);\n dispatchesByTargetId.set(cacheKey, {\n targetNodeId,\n edgeType: spec.edgeType,\n traversedDirection: direction,\n weight: edge.weight ?? 1,\n opinion: projectedOpinion,\n operator: result.operator,\n rationale: existingDispatch\n ? `${existingDispatch.rationale}; ${result.rationale}`\n : result.rationale,\n hop: nextHop,\n });\n\n if (canContinueTransitively(spec, nextHop)) {\n queue.push({\n nodeId: targetNodeId,\n opinion: projectedOpinion,\n hop: nextHop,\n visitedNodeIds: new Set([\n ...state.visitedNodeIds,\n String(targetNodeId),\n ]),\n });\n }\n }\n }\n }\n }\n\n return Array.from(dispatchesByTargetId.values()).sort((left, right) => {\n if (left.hop !== right.hop) {\n return left.hop - right.hop;\n }\n return String(left.targetNodeId).localeCompare(String(right.targetNodeId));\n });\n}\n","/**\n * Epistemic Beliefs API\n *\n * Clean API for managing beliefs in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces beliefs.ts.\n *\n * Key differences from beliefs.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no runtime ID translation fallback)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\n\n// All IDs now use epistemicNodes exclusively\nexport const insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_PROJECT_BELIEF_LIMIT = 250;\nexport const MAX_PROJECT_BELIEF_LIMIT = 1000;\nexport const optionalBeliefScopeArgs = optionalScopeArgs;\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype BeliefScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\n\ntype EpistemicNodeOpinionDoc = Doc<\"epistemicNodes\"> & {\n opinion_a?: number;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n tupleContradicted?: boolean;\n userId?: string;\n metadata?: Record<string, unknown> | null;\n};\n\ntype EpistemicIndexQuery = {\n eq(field: string, value: unknown): EpistemicIndexQuery;\n gt(field: string, value: unknown): EpistemicIndexQuery;\n lt(field: string, value: unknown): EpistemicIndexQuery;\n field(field: string): string;\n};\n\ntype EpistemicQueryChain<T> = {\n withIndex(\n _name: string,\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n order(direction: \"asc\" | \"desc\"): EpistemicQueryChain<T>;\n filter(\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n first(): Promise<T | null>;\n collect(): Promise<T[]>;\n take(limit: number): Promise<T[]>;\n};\n\ntype EpistemicBeliefCtx = QueryCtx & {\n db: {\n query<T = unknown>(_table: string): EpistemicQueryChain<T>;\n get<T = unknown>(id: Id<string>): Promise<T | null>;\n };\n scheduler: {\n runAfter(\n _delayMs: number,\n _handler: unknown,\n _args: unknown,\n ): Promise<unknown>;\n };\n};\n\ntype AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nconst DEFAULT_CONFIDENCE_POLICY: ConfidencePolicyConfig = {\n scoringMode: \"after_worktree\",\n tupleContradiction: normalizeTupleContradictionPolicy(),\n};\n\nexport type BeliefConfidenceTrigger =\n | \"initial\"\n | \"evidence_added\"\n | \"evidence_removed\"\n | \"contradiction_detected\"\n | \"contradiction_resolved\"\n | \"agent_assessment\"\n | \"worktree_outcome\"\n | \"worktree_completed\"\n // SL-specific triggers\n | \"fusion\"\n | \"discount\"\n | \"deduction\"\n | \"backfill_synthetic\"\n | VerificationConfidenceTrigger;\n\nexport function throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredMutationError;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function assertBaseRateInRange(baseRate: number, field = \"baseRate\"): number {\n if (baseRate < 0 || baseRate > 1) {\n throwStructuredMutationError({\n message: `${field} must be within [0, 1].`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"request.valid_shape\",\n suggestion: `Clamp ${field} into the inclusive [0, 1] interval.`,\n details: { field, baseRate },\n });\n }\n return baseRate;\n}\n\nexport function buildBeliefConfidenceRow(args: {\n beliefId: Id<\"epistemicNodes\">;\n belief: number;\n disbelief: number;\n uncertainty: number;\n baseRate: number;\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n assessedBy: string;\n assessedAt: number;\n slOperator?: SLOperator;\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringContradictionId?: Id<\"contradictions\">;\n triggeringWorktreeId?: string;\n}) {\n return {\n beliefId: args.beliefId,\n confidence: confidenceFromSL(\n args.belief,\n args.disbelief,\n args.uncertainty,\n args.baseRate,\n ),\n belief: args.belief,\n disbelief: args.disbelief,\n uncertainty: args.uncertainty,\n baseRate: args.baseRate,\n slOperator: args.slOperator ?? (\"prior_seed\" as const),\n trigger: args.trigger,\n ...(args.rationale ? { rationale: args.rationale } : {}),\n assessedBy: args.assessedBy,\n assessedAt: args.assessedAt,\n ...(args.triggeringEvidenceId\n ? {\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringEvidenceIds: [String(args.triggeringEvidenceId)],\n }\n : {}),\n ...(args.triggeringContradictionId\n ? {\n triggeringContradictionId: args.triggeringContradictionId,\n }\n : {}),\n ...(args.triggeringWorktreeId\n ? { triggeringWorktreeId: args.triggeringWorktreeId }\n : {}),\n };\n}\n\ntype BeliefStatusResult =\n | { success: true }\n | { success: false; message: \"Evidence node not found\" };\n\nexport function buildBeliefStatusSuccessResult(): BeliefStatusResult {\n return { success: true };\n}\n\nexport function buildBeliefEvidenceNotFoundResult(): BeliefStatusResult {\n const result = {} as Extract<BeliefStatusResult, { success: false }>;\n result.success = false;\n result.message = \"Evidence node not found\";\n return result;\n}\n\nexport function deriveSyntheticBackfillOpinion(\n source: Record<string, unknown>,\n): SLOpinion {\n const belief =\n readFiniteNumber(source.opinion_b) ?? readFiniteNumber(source.belief);\n const disbelief =\n readFiniteNumber(source.opinion_d) ?? readFiniteNumber(source.disbelief);\n const uncertainty =\n readFiniteNumber(source.opinion_u) ?? readFiniteNumber(source.uncertainty);\n const baseRate =\n readFiniteNumber(source.opinion_a) ?? readFiniteNumber(source.baseRate);\n\n if (\n belief !== undefined ||\n disbelief !== undefined ||\n uncertainty !== undefined ||\n baseRate !== undefined\n ) {\n try {\n return readOpinionFromRecord(source);\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to decode legacy belief opinion\",\n {\n error,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n }\n\n const confidence = clamp01(readFiniteNumber(source.confidence) ?? 0);\n return mkOpinion(confidence, 1 - confidence, 0, 0.5);\n}\n\nexport function clampBeliefLimit(\n limit: number | undefined,\n fallback = DEFAULT_PROJECT_BELIEF_LIMIT,\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_PROJECT_BELIEF_LIMIT),\n );\n}\n\nexport function readTupleContradictedFlag(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readBeliefOpinionSnapshot(\n node: Doc<\"epistemicNodes\">,\n metadata: Record<string, unknown>,\n): SLOpinion {\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: (node as any).opinion_b,\n opinion_d: (node as any).opinion_d,\n opinion_u: (node as any).opinion_u,\n opinion_a: (node as any).opinion_a,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to read belief opinion snapshot\",\n {\n error,\n beliefId: node._id,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport function deriveTupleContradictionSeverity(\n node: Doc<\"epistemicNodes\">,\n): \"critical\" | \"significant\" | \"minor\" {\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const criticality =\n typeof metadata.criticality === \"string\" ? metadata.criticality : undefined;\n\n if (criticality === \"blocking\") {\n return \"critical\";\n }\n if (criticality === \"supporting\") {\n return \"minor\";\n }\n return \"significant\";\n}\n\nexport function formatTupleContradictionDescription(args: {\n opinion: Opinion;\n policy: ConfidencePolicyConfig[\"tupleContradiction\"];\n}): string {\n return `Tuple-space contradiction detected: b=${args.opinion.b.toFixed(2)} > ${args.policy.beliefThreshold.toFixed(2)} and d=${args.opinion.d.toFixed(2)} > ${args.policy.disbeliefThreshold.toFixed(2)}.`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `belief:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function resolveBeliefWorktreeId(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n const worktreeId = metadata?.worktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n\n const sprintId = metadata?.sprintId;\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\n// Map pillar names to valid pillar literals\ntype ValidPillar =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"regulatory\"\n | \"timing\"\n | \"customer\"\n | \"technology\"\n | \"distribution\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizePillar(pillar?: string): ValidPillar {\n if (!pillar) {\n return \"other\";\n }\n const lower = pillar.toLowerCase();\n const validPillars: ValidPillar[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n \"deal\",\n \"risks\",\n ];\n return (validPillars.find((p) => lower.includes(p)) ||\n \"other\") as ValidPillar;\n}\n\nexport async function markBeliefGraphDirty(\n ctx: EpistemicBeliefCtx,\n scope: { projectId?: string | null; topicId?: string | null },\n): Promise<void> {\n const projectId =\n typeof scope.projectId === \"string\" && scope.projectId.trim().length > 0\n ? scope.projectId\n : undefined;\n const topicId =\n typeof scope.topicId === \"string\" && scope.topicId.trim().length > 0\n ? scope.topicId\n : undefined;\n\n if (!projectId && !topicId) {\n return;\n }\n\n if (projectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n { projectId },\n );\n }\n if (topicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n { topicId },\n );\n }\n\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n topicId ?? projectId!,\n {\n lastActivityAt: Date.now(),\n },\n );\n}\n\nexport async function resolveBeliefScopeOrNull(\n ctx: QueryCtx,\n args: BeliefScopeArgs,\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 \"[epistemicBeliefs] Failed to resolve belief scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n },\n );\n return null;\n }\n}\n\nexport async function getBeliefNodesForScope(\n ctx: EpistemicBeliefCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number; status?: string },\n) {\n const baseQuery = ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\"),\n );\n const nodes: EpistemicNodeOpinionDoc[] =\n typeof args?.scanLimit === \"number\"\n ? (await baseQuery.order(\"desc\").take(args.scanLimit)) as EpistemicNodeOpinionDoc[]\n : (await baseQuery.collect()) as EpistemicNodeOpinionDoc[];\n const scopedNodes = nodes.filter((node: Doc<\"epistemicNodes\">) =>\n nodeMatchesWorkspaceReasoningScope(node, scope),\n );\n\n if (!args?.status) {\n return scopedNodes;\n }\n\n return scopedNodes.filter((node: EpistemicNodeOpinionDoc) => node.status === args.status);\n}\n\nexport function createBeliefAudienceResolver(\n registryRows: Array<{\n audienceKey?: string | null;\n audienceClass: AudienceClass;\n }>,\n) {\n const audienceClassByKey = new Map<string, AudienceClass>(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ]),\n );\n\n return (\n audienceKey: string | undefined | null,\n fallback: AudienceClass,\n ): AudienceClass => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return (\n audienceClassByKey.get(key) ??\n (classFromAudienceKey(key, fallback) as AudienceClass)\n );\n };\n}\n\nexport function flattenBeliefNode(node: Doc<\"epistemicNodes\">) {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const worktreeId = resolveBeliefWorktreeId(meta);\n const tupleContradicted =\n readTupleContradictedFlag(\n (node as EpistemicNodeOpinionDoc).tupleContradicted,\n ) ??\n readTupleContradictedFlag(meta.tupleContradicted) ??\n false;\n\n return {\n _id: node._id,\n _epistemicNodeId: node._id,\n _creationTime: node._creationTime,\n belief: node.canonicalText,\n formulation: node.canonicalText,\n projectId: node.projectId,\n topicId: node.topicId,\n userId: (node as EpistemicNodeOpinionDoc).userId || node.createdBy || \"\",\n confidence: (meta.confidence as \"high\" | \"medium\" | \"low\") || \"untested\",\n status: node.status,\n beliefStatus: resolveBeliefStatus(node, meta),\n topic: (meta.topic as string) || (meta.pillar as string) || \"other\",\n pillar: (meta.pillar as string) || (meta.topic as string) || \"\",\n category: (meta.category as string) || \"\",\n subcategory: (meta.subcategory as string) || \"\",\n categoryIcon: (meta.categoryIcon as string) || \"\",\n supportingEvidence: (meta.supportingEvidenceIds as string[]) || [],\n contradictingEvidence: (meta.contradictingEvidenceIds as string[]) || [],\n testingQuestions: (meta.testingQuestionIds as string[]) || [],\n linkedInsights: (meta.linkedInsightIds as string[]) || [],\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || node.createdAt,\n tupleContradicted,\n sprintId: (meta.sprintId as string) || undefined,\n worktreeId,\n sourceBeliefIds: (meta.sourceBeliefIds as string[]) || undefined,\n criticality:\n (meta.criticality as\n | \"critical\"\n | \"supporting\"\n | \"nice_to_have\"\n | \"unanalyzed\"\n | \"blocking\"\n | \"important\") || \"unanalyzed\",\n rationale: (meta.rationale as string) || \"\",\n audienceLabel: node.audienceLabel,\n policyTags: node.policyTags,\n sensitivityTier: node.sensitivityTier,\n exportClass: node.exportClass,\n anonymizationClass: node.anonymizationClass,\n };\n}\n\nexport function resolveBeliefStatus(\n node: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n },\n metadata: Record<string, unknown>,\n): BeliefLifecycleStatus {\n return resolveBeliefLifecycleStatus({\n beliefStatus: node.beliefStatus,\n confidence: node.confidence,\n predictionMeta: node.predictionMeta,\n metadata,\n });\n}\n\nexport async function hasCompletedWorktreeForBelief(\n ctx: EpistemicBeliefCtx,\n beliefNodeId: Id<\"epistemicNodes\">,\n): Promise<boolean> {\n // Check if the belief is linked to a completed worktree via worktreeBeliefCluster\n const clusterMembership = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_belief\", (q: any) => q.eq(\"beliefId\", beliefNodeId))\n .collect();\n for (const membership of clusterMembership) {\n const worktree = await ctx.db.get(membership.worktreeId);\n if (worktree?.status === \"completed\" || worktree?.status === \"merged\") {\n return true;\n }\n }\n return false;\n}\n\nexport async function getActiveConfidencePolicy(\n ctx: EpistemicBeliefCtx,\n): Promise<ConfidencePolicyConfig> {\n try {\n const activeConfig = await ctx.db\n .query(\"logicSprintScoring\")\n .withIndex(\"by_active\", (q: any) => q.eq(\"isActive\", true))\n .first();\n\n return {\n scoringMode:\n activeConfig?.confidencePolicy === \"always\"\n ? \"always\"\n : DEFAULT_CONFIDENCE_POLICY.scoringMode,\n tupleContradiction: normalizeTupleContradictionPolicy(\n activeConfig?.tupleContradictionPolicy as\n | Partial<ConfidencePolicyConfig[\"tupleContradiction\"]>\n | undefined,\n ),\n };\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to load active confidence policy\",\n {\n error,\n },\n );\n // K-tier/component environments do not carry logicSprintScoring.\n return DEFAULT_CONFIDENCE_POLICY;\n }\n}\n\nexport async function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(\n ctx as Parameters<typeof getCurrentUserId>[0],\n );\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking belief mutations.\",\n });\n }\n return userId;\n}\n\nexport async function requireProjectWriteAccess(\n ctx: { db: unknown },\n projectId: string,\n userId: string,\n): Promise<void> {\n const hasAccess = await checkProjectAccess(\n ctx as Parameters<typeof checkProjectAccess>[0],\n projectId,\n userId,\n );\n if (!hasAccess) {\n throwStructuredMutationError({\n message: \"Project access required.\",\n status: 403,\n code: \"FORBIDDEN\",\n invariantCode: \"policy.scope_required\",\n suggestion: \"Request write access for the project and retry.\",\n details: { projectId, userId },\n });\n }\n}\n","/** Split confidence operations out of epistemicBeliefs.ts. */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport {\n buildBeliefConfidenceRow,\n deriveTupleContradictionSeverity,\n formatTupleContradictionDescription,\n getActiveConfidencePolicy,\n hasCompletedWorktreeForBelief,\n readBeliefOpinionSnapshot,\n readTupleContradictedFlag,\n resolveBeliefStatus,\n throwStructuredMutationError,\n requireProjectWriteAccess,\n type BeliefConfidenceTrigger,\n} from \"./epistemicBeliefs.helpers\";\n\nexport async function applyBeliefConfidenceChange(\n ctx: MutationCtx,\n args: {\n nodeId: Id<\"epistemicNodes\">;\n // SL opinion — the ONLY confidence input (EK-7)\n belief: number; // b: evidence FOR [0,1]\n disbelief: number; // d: evidence AGAINST [0,1]\n uncertainty: number; // u: lack of evidence [0,1]\n baseRate?: number; // a: prior probability [0,1], defaults to 0.5\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n authenticatedUserId: string;\n slOperator?: SLOperator; // which SL operator produced this opinion\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringWorktreeId?: string;\n },\n): Promise<{\n nodeId: Id<\"epistemicNodes\">;\n previousConfidence: number;\n newConfidence: number;\n opinion: { b: number; d: number; u: number; a: number };\n beliefConfidenceId: Id<\"beliefConfidence\">;\n}> {\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Node not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n invariantCode: \"belief.exists\",\n suggestion:\n \"Verify nodeId points to an existing node before appending SL scoring.\",\n details: { nodeId: args.nodeId },\n });\n }\n if (node.nodeType !== \"belief\") {\n throwStructuredMutationError({\n message: `appendSlScoring only applies to belief nodes. Received nodeType \"${node.nodeType}\". Entity nodes (company, person, investor, etc.) do not have confidence — use entityLifecycle.updateEntityAttributes for mutable entity data.`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"entity.no_confidence\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes for entity mutations. appendSlScoring is for belief nodes only.\",\n details: { nodeId: args.nodeId, nodeType: node.nodeType },\n });\n }\n if (!node.projectId) {\n throwStructuredMutationError({\n message: \"Belief has no project scope.\",\n status: 400,\n code: \"MISSING_SCOPE\",\n invariantCode: \"belief.project_required\",\n suggestion: \"Belief must have a projectId before SL scoring can be appended.\",\n details: { nodeId: args.nodeId },\n });\n }\n await requireProjectWriteAccess(\n ctx,\n node.projectId,\n args.authenticatedUserId,\n );\n\n const existingMetadata = (node.metadata || {}) as Record<string, unknown>;\n const currentBeliefStatus = resolveBeliefStatus(node, existingMetadata);\n const confidencePolicy = await getActiveConfidencePolicy(ctx);\n if (\n confidencePolicy.scoringMode === \"after_worktree\" &&\n isPreValidationBeliefStatus(currentBeliefStatus)\n ) {\n const hasCompletedWorktree = await hasCompletedWorktreeForBelief(\n ctx,\n args.nodeId,\n );\n if (!hasCompletedWorktree) {\n throwStructuredMutationError({\n message:\n \"Cannot score belief before worktree completion. Complete a worktree that tests this belief first.\",\n status: 409,\n code: \"CONFLICT\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Complete a worktree linked to this belief before recording SL scoring.\",\n details: { nodeId: args.nodeId },\n });\n }\n }\n\n const previousConfidence = node.confidence || 0.5;\n const predictionMeta =\n (node as any).predictionMeta || existingMetadata.predictionMeta;\n const previousOpinion = readBeliefOpinionSnapshot(node, existingMetadata);\n\n // SL opinion — the only path (EK-7)\n const slB = args.belief;\n const slD = args.disbelief;\n const slU = args.uncertainty;\n const slA = args.baseRate ?? 0.5;\n const nextOpinion = { b: slB, d: slD, u: slU, a: slA };\n const derivedConfidence = confidenceFromSL(slB, slD, slU, slA);\n const isFirstScoring =\n typeof node.confidence !== \"number\" || !Number.isFinite(node.confidence);\n const previousTupleContradicted =\n readTupleContradictedFlag((node as any).tupleContradicted) ??\n readTupleContradictedFlag(existingMetadata.tupleContradicted) ??\n detectTupleContradiction(\n previousOpinion,\n confidencePolicy.tupleContradiction.beliefThreshold,\n confidencePolicy.tupleContradiction.disbeliefThreshold,\n );\n const tupleTransition = evaluateTupleContradictionTransition({\n previousTupleContradicted,\n opinion: nextOpinion,\n policy: confidencePolicy.tupleContradiction,\n });\n const tupleContradictionDescription = formatTupleContradictionDescription({\n opinion: nextOpinion,\n policy: tupleTransition.policy,\n });\n\n const newBeliefStatus = promoteBeliefStatusAfterScoring(currentBeliefStatus, {\n confidence: derivedConfidence,\n predictionMeta,\n metadata: existingMetadata,\n });\n\n let tupleContradictionId: Id<\"contradictions\"> | undefined;\n if (tupleTransition.crossedIntoTupleContradiction) {\n tupleContradictionId = (await ctx.runMutation(\n \"contradictions:create\" as any,\n {\n projectId: node.projectId,\n topicId: node.topicId as any,\n beliefId: args.nodeId,\n beliefBId: args.nodeId,\n supportingInsightIds: [],\n contradictingInsightIds: [],\n severity: deriveTupleContradictionSeverity(node),\n source: \"tuple_space\",\n detectionMethod: \"agent\",\n description: tupleContradictionDescription,\n createdBy: args.authenticatedUserId,\n },\n )) as Id<\"contradictions\">;\n }\n\n await ctx.db.patch(args.nodeId, {\n confidence: derivedConfidence,\n beliefStatus: newBeliefStatus,\n tupleContradicted: tupleTransition.tupleContradicted,\n updatedAt: now,\n // Store SL opinion fields at node level for fast access\n opinion_b: slB,\n opinion_d: slD,\n opinion_u: slU,\n opinion_a: slA,\n metadata: {\n ...existingMetadata,\n beliefStatus: newBeliefStatus,\n slBelief: slB,\n slDisbelief: slD,\n slUncertainty: slU,\n slBaseRate: slA,\n tupleContradicted: tupleTransition.tupleContradicted,\n },\n } as any);\n\n if (isFirstScoring) {\n const nodeTopicId = node.topicId;\n const themeNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic\", (q: any) =>\n q.eq(\"topicId\", nodeTopicId || node.projectId),\n )\n .filter((q) => q.eq(q.field(\"nodeType\"), \"theme\"))\n .collect();\n\n for (const theme of themeNodes) {\n if (theme.globalId && node.globalId) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: `edge-${node.globalId}-relates_to_thesis-${theme.globalId}`,\n fromGlobalId: node.globalId,\n toGlobalId: theme.globalId,\n edgeType: \"relates_to_thesis\",\n weight: derivedConfidence,\n createdBy: args.authenticatedUserId,\n topicId: String(node.projectId),\n fromNodeType: \"belief\",\n toNodeType: \"theme\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n }\n\n const storedRationale =\n args.rationale ??\n `Confidence changed from ${previousConfidence.toFixed(2)} (nodeId: ${args.nodeId})`;\n\n const beliefConfidenceId = (await ctx.db.insert(\"beliefConfidence\", {\n ...buildBeliefConfidenceRow({\n beliefId: args.nodeId as Id<\"epistemicNodes\">,\n belief: slB,\n disbelief: slD,\n uncertainty: slU,\n baseRate: slA,\n trigger: args.trigger,\n rationale: storedRationale,\n assessedBy: args.authenticatedUserId,\n assessedAt: now,\n slOperator: args.slOperator,\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringContradictionId: tupleContradictionId,\n triggeringWorktreeId: args.triggeringWorktreeId,\n }),\n } as any)) as Id<\"beliefConfidence\">;\n\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: args.nodeId,\n changeType: \"confidence_changed\",\n previousState: {\n confidence: previousConfidence,\n tupleContradicted: previousTupleContradicted,\n },\n newState: {\n opinion: nextOpinion,\n confidence: derivedConfidence,\n trigger: args.trigger,\n rationale: storedRationale,\n tupleContradicted: tupleTransition.tupleContradicted,\n tupleContradictionPolicy: tupleTransition.policy,\n ...(tupleContradictionId\n ? { tupleContradictionId: String(tupleContradictionId) }\n : {}),\n },\n changedBy: args.authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: node.projectId,\n topicId: node.topicId,\n });\n\n if (\n tupleTransition.crossedIntoTupleContradiction ||\n tupleTransition.crossedOutOfTupleContradiction\n ) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: args.nodeId,\n changeType: \"updated\",\n previousState: { tupleContradicted: previousTupleContradicted },\n newState: {\n tupleContradicted: tupleTransition.tupleContradicted,\n action: tupleTransition.crossedIntoTupleContradiction\n ? \"tuple_contradiction_detected\"\n : \"tuple_contradiction_cleared\",\n opinion: nextOpinion,\n tupleContradictionPolicy: tupleTransition.policy,\n ...(tupleContradictionId\n ? { tupleContradictionId: String(tupleContradictionId) }\n : {}),\n },\n rationale: tupleTransition.crossedIntoTupleContradiction\n ? tupleContradictionDescription\n : `Tuple-space contradiction cleared: b=${nextOpinion.b.toFixed(2)}, d=${nextOpinion.d.toFixed(2)} no longer exceed the configured policy thresholds.`,\n changedBy: args.authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: node.projectId,\n topicId: node.topicId,\n });\n }\n\n if (Math.abs(derivedConfidence - previousConfidence) >= 0.15) {\n await ctx.scheduler.runAfter(\n 5000,\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: args.nodeId as string,\n projectId: node.projectId,\n },\n );\n }\n\n // WT-4: Re-evaluate publication rules after confidence changes.\n // Publication is visibility-based: rules auto-determine which workspace\n // nodes are exposed at tenant scope based on confidence thresholds, etc.\n if (node.workspaceId && node.tenantId) {\n await ctx.scheduler.runAfter(\n 0,\n (internal as any).publication.evaluateNodePublication,\n { nodeId: args.nodeId },\n );\n }\n\n return {\n nodeId: args.nodeId,\n previousConfidence,\n newConfidence: derivedConfidence,\n opinion: { b: slB, d: slD, u: slU, a: slA },\n beliefConfidenceId,\n };\n}\n\nfunction propagationTriggerForEdge(\n edgeType: string,\n weight: number,\n): BeliefConfidenceTrigger {\n if (edgeType === \"contradicts\" || edgeType === \"refutes\") {\n return \"contradiction_detected\";\n }\n\n if ((edgeType === \"supports\" || edgeType === \"informs\") && weight < 0) {\n return \"contradiction_detected\";\n }\n\n return \"evidence_added\";\n}\n\n// =============================================================================\n// SL PROPAGATION — EDGE-DEFINED OPINION PROPAGATION (EK-7, LKC-5)\n// =============================================================================\n\n/**\n * Propagate a confidence change through graph edges whose specs allow it.\n *\n * After a belief is scored, this function:\n * 1. Reads the graph-primitives edge propagation specs\n * 2. Traverses matching incoming/outgoing/bidirectional edges hop by hop\n * 3. Applies the edge operator with per-hop damping and hop limits\n * 4. Writes propagated opinions as new beliefConfidence entries\n */\nexport const propagateConfidenceChange = internalMutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n opinion_b: v.number(),\n opinion_d: v.number(),\n opinion_u: v.number(),\n opinion_a: v.number(),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const sourceOpinion = mkOpinion(\n args.opinion_b,\n args.opinion_d,\n args.opinion_u,\n args.opinion_a,\n );\n\n const sourceNode = await ctx.db.get(args.nodeId);\n const sourceScope = await resolveNodeScopeForWorkspaceIsolation(\n ctx,\n sourceNode,\n );\n const dispatches = await collectConfidencePropagationDispatches({\n sourceNodeId: args.nodeId,\n sourceOpinion,\n sourceScope,\n queryEdges: async ({ nodeId, spec, direction }) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\n direction === \"outgoing\" ? \"by_from_type\" : \"by_to_type\",\n (q: any) =>\n direction === \"outgoing\"\n ? q.eq(\"fromNodeId\", nodeId).eq(\"edgeType\", spec.edgeType)\n : q.eq(\"toNodeId\", nodeId).eq(\"edgeType\", spec.edgeType),\n )\n .collect();\n },\n getNode: async (nodeId) => await ctx.db.get(nodeId),\n });\n\n for (const dispatch of dispatches) {\n await applyBeliefConfidenceChange(ctx, {\n nodeId: dispatch.targetNodeId,\n belief: dispatch.opinion.b,\n disbelief: dispatch.opinion.d,\n uncertainty: dispatch.opinion.u,\n baseRate: dispatch.opinion.a,\n trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),\n rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,\n authenticatedUserId: args.userId,\n slOperator: dispatch.operator as SLOperator,\n });\n }\n\n return {\n propagated: dispatches.map((dispatch) => ({\n targetNodeId: String(dispatch.targetNodeId),\n edgeType: dispatch.edgeType,\n operator: dispatch.operator,\n })),\n count: dispatches.length,\n };\n },\n});\n"]}