@lucern/graph-primitives 0.3.0-alpha.1 → 0.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{beliefDecay-Q_26RTc-.d.ts → beliefDecay-DZ6tkLYq.d.ts} +1 -1
- package/dist/beliefDecay.d.ts +1 -1
- package/dist/beliefDecay.js +158 -47
- package/dist/beliefDecay.js.map +1 -1
- package/dist/{beliefEvidenceLinks-42FlR48t.d.ts → beliefEvidenceLinks-CWOXxxJg.d.ts} +1 -1
- package/dist/beliefEvidenceLinks.d.ts +1 -1
- package/dist/beliefEvidenceLinks.js +141 -45
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/{beliefLifecycle-C-AehZgF.d.ts → beliefLifecycle-y8WLXqQj.d.ts} +1 -1
- package/dist/beliefLifecycle.d.ts +1 -1
- package/dist/confidencePropagationDispatch.d.ts +1 -1
- package/dist/confidencePropagationDispatch.js +1 -3
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/{contradictions-Hdwl7zid.d.ts → contradictions-51VLsESq.d.ts} +1 -1
- package/dist/contradictions.d.ts +1 -1
- package/dist/contradictions.js +67 -8
- package/dist/contradictions.js.map +1 -1
- package/dist/debug.d.ts +4 -0
- package/dist/debug.js +34 -0
- package/dist/debug.js.map +1 -0
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/dependsOn.js.map +1 -1
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.js +1 -3
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.js +1 -3
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/refutes.js +1 -3
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/utils.d.ts +3 -3
- package/dist/edges/utils.js +2 -4
- package/dist/edges/utils.js.map +1 -1
- package/dist/embeddingTrigger.js +21 -1
- package/dist/embeddingTrigger.js.map +1 -1
- package/dist/entityBridge.js +1 -1
- package/dist/entityBridge.js.map +1 -1
- package/dist/{entityLifecycle-BkhRJ-XI.d.ts → entityLifecycle-CvgSK5FV.d.ts} +1 -1
- package/dist/entityLifecycle.d.ts +1 -1
- package/dist/entityLifecycle.js +134 -47
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/{epistemicAnswers-DSP1slZ9.d.ts → epistemicAnswers-C5ib4z6_.d.ts} +1 -1
- package/dist/epistemicAnswers.d.ts +1 -1
- package/dist/epistemicAnswers.js +67 -8
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/{epistemicBeliefs-DtFVTp-k.d.ts → epistemicBeliefs-DzKjZAeC.d.ts} +3 -3
- package/dist/epistemicBeliefs.d.ts +2 -2
- package/dist/epistemicBeliefs.js +289 -114
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicContracts.d.ts +1 -1
- package/dist/epistemicContracts.js +297 -115
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/{epistemicEdges-DcA8ErUG.d.ts → epistemicEdges-CD5vxmlH.d.ts} +3 -3
- package/dist/epistemicEdges.d.ts +1 -1
- package/dist/epistemicEdges.js +192 -60
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/{epistemicEvidence-Bo638XDP.d.ts → epistemicEvidence-xw6UUrwh.d.ts} +1 -1
- package/dist/epistemicEvidence.d.ts +1 -1
- package/dist/epistemicEvidence.js +163 -49
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/{epistemicHelpers-Bd9xbaib.d.ts → epistemicHelpers-DevrYgPN.d.ts} +1 -1
- package/dist/epistemicHelpers.d.ts +1 -1
- package/dist/{epistemicLinking-CyeLOIzN.d.ts → epistemicLinking-CfE00tHJ.d.ts} +1 -1
- package/dist/epistemicLinking.d.ts +1 -1
- package/dist/epistemicLinking.js +1 -1
- package/dist/{epistemicNodes-BpD6Koud.d.ts → epistemicNodes-NBrPW7fk.d.ts} +2 -2
- package/dist/epistemicNodes.d.ts +1 -1
- package/dist/epistemicNodes.js +163 -33
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/{epistemicQuestions-CmEeY6zQ.d.ts → epistemicQuestions-B_nUclrH.d.ts} +1 -1
- package/dist/epistemicQuestions.d.ts +1 -1
- package/dist/epistemicQuestions.js +311 -62
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/{epistemicSources-ZazxHOK1.d.ts → epistemicSources-dlKj58Jp.d.ts} +1 -1
- package/dist/epistemicSources.d.ts +1 -1
- package/dist/epistemicSources.js +65 -8
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.js +297 -115
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lintCheckerEvaluator.js.map +1 -1
- package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -1
- package/dist/evaluators/shared.js +20 -1
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/testRunnerEvaluator.js +20 -1
- package/dist/evaluators/testRunnerEvaluator.js.map +1 -1
- package/dist/evaluators/tscCheckerEvaluator.js.map +1 -1
- package/dist/index.d.ts +20 -20
- package/dist/index.js +729 -206
- package/dist/index.js.map +1 -1
- package/dist/{ontology-matching-Buhu23ss.d.ts → ontology-matching-C6rrz2VP.d.ts} +1 -1
- package/dist/ontology-matching.d.ts +1 -1
- package/dist/{ontologyApproval-Ba0Jjk1k.d.ts → ontologyApproval-CFYmqKmk.d.ts} +1 -1
- package/dist/ontologyApproval.d.ts +1 -1
- package/dist/ontologyDefinitions.js +4 -3
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyHelpers.d.ts +1 -1
- package/dist/ontologyHelpers.js +4 -3
- package/dist/ontologyHelpers.js.map +1 -1
- package/dist/{projectionReconciliation-CxrXYGaB.d.ts → projectionReconciliation-jww2fBI0.d.ts} +1 -1
- package/dist/projectionReconciliation.d.ts +1 -1
- package/dist/projectionReconciliation.js +14 -20
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/{projectionStaleness-CAdpIsaW.d.ts → projectionStaleness-CmdbpjVK.d.ts} +1 -1
- package/dist/projectionStaleness.d.ts +1 -1
- package/dist/{questionEvidenceLinks-BdQD0TkM.d.ts → questionEvidenceLinks-DFlyPpAj.d.ts} +1 -1
- package/dist/questionEvidenceLinks.d.ts +1 -1
- package/dist/questionEvidenceLinks.js +144 -45
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js +86 -37
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.js +64 -7
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{text-matching-CMn2WnVD.d.ts → text-matching-DNg4M5Wd.d.ts} +1 -1
- package/dist/text-matching.d.ts +1 -1
- package/dist/topicProjectOverlay.js +56 -13
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/topicScope.js +55 -6
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.js +55 -6
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.js +55 -6
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/contradictions.ts"],"names":["normalizeScopeValue","topicId","v"],"mappings":"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","file":"contradictions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(ctx: any, scopeId: string): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch {\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(args.topicId as Id<\"topics\">)) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId))\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">\n )) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<ReturnType<typeof resolveTopicProjectScope>>;\nexport type SoftResolvedScope = {\n topicId?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source?: ResolvedScope[\"source\"];\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\nexport async function resolveScope(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!topicId && !projectId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch {\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Contradiction Detection & Surfacing (Phase 8.3)\n *\n * Contradictions are GOLD. When evidence conflicts for a belief,\n * that's a signal to dig deeper. This module detects, tracks, and\n * helps resolve contradictions in the belief system.\n */\n\nimport { v } from \"convex/values\";\nimport { internal } from \"./convex\";\nimport type { Doc, Id } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport { checkProjectAccess, requireProjectAccess } from \"@lucern/access-control/access\";\nimport { resolveScopeSoft, scopeArgs } from \"./scopeResolverCompat\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\n\n// IDs are now always epistemicNodes IDs (backfill complete)\nconst _beliefIdUnion = v.id(\"epistemicNodes\");\nconst _insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_CONTRADICTION_SOURCE = \"evidence_links\" as const;\nconst TUPLE_SPACE_CONTRADICTION_SOURCE = \"tuple_space\" as const;\n\nfunction contradictionSourceOf(\n contradiction: { source?: unknown } | null | undefined\n): \"evidence_links\" | \"tuple_space\" {\n return contradiction?.source === TUPLE_SPACE_CONTRADICTION_SOURCE\n ? TUPLE_SPACE_CONTRADICTION_SOURCE\n : DEFAULT_CONTRADICTION_SOURCE;\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Detect contradictions for a project\n * Finds beliefs that have both supporting AND contradicting evidence\n */\nexport const detectContradictions = query({\n args: {\n ...scopeArgs,\n includeResolved: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n // Get all beliefs from epistemic spine\n const beliefs = await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n );\n\n // Get all belief-evidence links\n const contradictionCandidates: Array<{\n beliefId: Id<\"epistemicNodes\">;\n belief: Doc<\"epistemicNodes\">;\n supportingInsights: Doc<\"epistemicNodes\">[];\n contradictingInsights: Doc<\"epistemicNodes\">[];\n existingContradiction?: Doc<\"contradictions\">;\n }> = [];\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n\n const supportingLinks = evidenceLinks.filter(\n (l) => l.relation === \"supports\"\n );\n const contradictingLinks = evidenceLinks.filter(\n (l) => l.relation === \"contradicts\"\n );\n\n // Only flag as contradiction if BOTH supporting AND contradicting evidence exists\n if (supportingLinks.length > 0 && contradictingLinks.length > 0) {\n // Fetch the actual insights\n const supportingInsights = await Promise.all(\n supportingLinks.map((l) => ctx.db.get(l.insightId))\n );\n const contradictingInsights = await Promise.all(\n contradictingLinks.map((l) => ctx.db.get(l.insightId))\n );\n\n // Check if there's already a tracked contradiction\n const existingContradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n const existingContradiction = existingContradictions.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Skip resolved contradictions unless explicitly requested\n if (\n existingContradiction &&\n !args.includeResolved &&\n existingContradiction.status !== \"unresolved\" &&\n existingContradiction.status !== \"investigating\"\n ) {\n continue;\n }\n\n contradictionCandidates.push({\n beliefId: belief._id,\n belief,\n supportingInsights: supportingInsights.filter(\n Boolean\n ) as Doc<\"epistemicNodes\">[],\n contradictingInsights: contradictingInsights.filter(\n Boolean\n ) as Doc<\"epistemicNodes\">[],\n existingContradiction: existingContradiction ?? undefined,\n });\n }\n }\n\n return contradictionCandidates;\n },\n});\n\n/**\n * Get all tracked contradictions for a project\n */\nexport const getByProject = query({\n args: {\n ...scopeArgs,\n userId: v.string(),\n status: v.optional(\n v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n )\n ),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const hasAccess = await checkProjectAccess(ctx, projectId, args.userId);\n if (!hasAccess) {\n return [];\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 200), 1000));\n const scanLimit = Math.min(pageSize * 3, 1000);\n\n let contradictions;\n\n if (args.status) {\n const status = args.status; // Capture in local variable for type narrowing\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", status)\n )\n .order(\"desc\")\n .take(scanLimit);\n } else {\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topicId\", (q) => q.eq(\"topicId\", String(scope.topicId ?? projectId)))\n .order(\"desc\")\n .take(scanLimit);\n }\n\n // Enrich with belief and insight data\n const enriched = await Promise.all(\n contradictions.slice(0, pageSize).map(async (c) => {\n const belief = await ctx.db.get(c.beliefId);\n const supportingInsights = await Promise.all(\n c.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n c.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...c,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n };\n })\n );\n\n return enriched;\n },\n});\n\n/**\n * Get unresolved contradiction count for dashboard\n */\nexport const getUnresolvedCount = query({\n args: {\n ...scopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", \"unresolved\")\n )\n .collect();\n\n const critical = contradictions.filter(\n (c) => c.severity === \"critical\"\n ).length;\n const significant = contradictions.filter(\n (c) => c.severity === \"significant\"\n ).length;\n const minor = contradictions.filter((c) => c.severity === \"minor\").length;\n\n return {\n total: contradictions.length,\n critical,\n significant,\n minor,\n };\n },\n});\n\n/**\n * Get a single contradiction with full context\n */\nexport const getById = query({\n args: { contradictionId: v.id(\"contradictions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const contradiction = await ctx.db.get(args.contradictionId);\n if (!contradiction) {\n return null;\n }\n\n const belief = await ctx.db.get(contradiction.beliefId);\n const supportingInsights = await Promise.all(\n contradiction.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n contradiction.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...contradiction,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n resolutionSprintId: (contradiction as any).resolutionSprintId ?? (contradiction as any).resolutionSprintId ?? null,\n };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Track a new contradiction\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n beliefId: v.id(\"epistemicNodes\"),\n beliefBId: v.optional(v.id(\"epistemicNodes\")),\n supportingInsightIds: v.array(v.id(\"epistemicNodes\")),\n contradictingInsightIds: v.array(v.id(\"epistemicNodes\")),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n source: v.optional(\n v.union(\n v.literal(\"evidence_links\"),\n v.literal(\"tuple_space\")\n )\n ),\n description: v.optional(v.string()),\n detectionMethod: v.optional(\n v.union(\n v.literal(\"semantic\"),\n v.literal(\"keyword\"),\n v.literal(\"manual\"),\n v.literal(\"agent\")\n )\n ),\n aiAnalysis: v.optional(\n v.object({\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n analyzedAt: v.number(),\n })\n ),\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n const source = args.source ?? DEFAULT_CONTRADICTION_SOURCE;\n\n // Evidence-link contradictions preserve the current \"merge evidence into the\n // active record\" behavior. Tuple-space contradictions are append-only and\n // should create a fresh record on each threshold crossing.\n const existingRows = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", args.beliefId))\n .collect();\n const existing = existingRows.find(\n (row) =>\n contradictionSourceOf(row) === source &&\n (args.beliefBId ? String((row as any).beliefBId ?? \"\") === String(args.beliefBId) : true)\n );\n\n if (existing && source !== TUPLE_SPACE_CONTRADICTION_SOURCE) {\n // Update existing contradiction with new evidence\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...new Set([\n ...existing.supportingInsightIds,\n ...args.supportingInsightIds,\n ]),\n ],\n contradictingInsightIds: [\n ...new Set([\n ...existing.contradictingInsightIds,\n ...args.contradictingInsightIds,\n ]),\n ],\n severity: args.severity,\n description: args.description ?? (existing as any).description,\n detectionMethod: args.detectionMethod ?? (existing as any).detectionMethod,\n aiAnalysis: args.aiAnalysis,\n });\n return existing._id;\n }\n\n // Create new contradiction\n return await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: args.beliefId,\n ...(args.beliefBId ? { beliefBId: args.beliefBId } : {}),\n supportingInsightIds: args.supportingInsightIds,\n contradictingInsightIds: args.contradictingInsightIds,\n source,\n ...(args.description ? { description: args.description } : {}),\n ...(args.detectionMethod ? { detectionMethod: args.detectionMethod } : {}),\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity: args.severity,\n aiAnalysis: args.aiAnalysis,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n },\n});\n\n/**\n * Update contradiction status\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateStatus = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n status: v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n resolutionSprintId: v.optional(v.string()),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId && args.userId) {\n await requireProjectAccess(ctx, existing.projectId, args.userId);\n }\n\n const now = Date.now();\n const update: Record<string, unknown> = { status: args.status };\n\n if (args.resolutionSprintId) {\n update.resolutionSprintId = args.resolutionSprintId;\n }\n\n if (\n args.status.startsWith(\"resolved_\") ||\n args.status === \"belief_forked\"\n ) {\n update.resolvedAt = now;\n }\n\n await ctx.db.patch(args.contradictionId, update);\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log all status changes to epistemicAudit\n // ============================================================\n if (existing.status !== args.status) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { status: existing.status },\n newState: {\n status: args.status,\n resolutionSprintId: args.resolutionSprintId,\n },\n rationale: `Contradiction status changed from ${existing.status} to ${args.status}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Resolve a contradiction with findings\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const resolve = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n verdict: v.string(),\n reasoning: v.string(),\n beliefUpdate: v.string(),\n resolvedBy: v.string(),\n newStatus: v.union(\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId) {\n await requireProjectAccess(ctx, existing.projectId, args.resolvedBy);\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.contradictionId, {\n status: args.newStatus,\n resolution: {\n verdict: args.verdict,\n reasoning: args.reasoning,\n beliefUpdate: args.beliefUpdate,\n resolvedBy: args.resolvedBy,\n },\n resolvedAt: now,\n });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log resolution to epistemicAudit with full context\n // ============================================================\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"resolved\",\n changedAt: now,\n changedBy: args.resolvedBy,\n isAgent: false,\n previousState: { status: existing.status },\n newState: {\n status: args.newStatus,\n verdict: args.verdict,\n beliefUpdate: args.beliefUpdate,\n },\n rationale: `Contradiction resolved: ${args.verdict}. Reasoning: ${args.reasoning}`,\n projectId: existing.projectId,\n });\n\n // Flywheel: After resolution, re-scan the affected belief neighborhood\n // Resolution may shift confidence, revealing new contradictions\n await ctx.scheduler.runAfter(\n 5000, // 5s delay\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: existing.beliefId as string,\n projectId: existing.projectId,\n }\n );\n\n return { success: true };\n },\n});\n\n/**\n * Update severity assessment\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateSeverity = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n const now = Date.now();\n await ctx.db.patch(args.contradictionId, { severity: args.severity });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log severity changes to epistemicAudit\n // ============================================================\n if (existing.severity !== args.severity) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"severity_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { severity: existing.severity },\n newState: { severity: args.severity },\n rationale: `Contradiction severity changed from ${existing.severity} to ${args.severity}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Add AI analysis to a contradiction\n */\nexport const addAiAnalysis = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.contradictionId, {\n aiAnalysis: {\n summary: args.summary,\n likelyExplanation: args.likelyExplanation,\n suggestedResolution: args.suggestedResolution,\n confidenceInAnalysis: args.confidenceInAnalysis,\n analyzedAt: Date.now(),\n },\n });\n return { success: true };\n },\n});\n\n/**\n * Scan project and auto-create contradictions for any beliefs with conflicting evidence\n * Called by cron job or manually\n */\nexport const scanAndCreateContradictions = mutation({\n args: {\n ...scopeArgs,\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n\n // Get all beliefs from epistemic spine\n const beliefs = await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n );\n\n let created = 0;\n let updated = 0;\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n\n const supportingIds = evidenceLinks\n .filter((l) => l.relation === \"supports\")\n .map((l) => l.insightId);\n const contradictingIds = evidenceLinks\n .filter((l) => l.relation === \"contradicts\")\n .map((l) => l.insightId);\n\n // Only create contradiction if BOTH sides have evidence\n if (supportingIds.length > 0 && contradictingIds.length > 0) {\n // Check if contradiction already exists\n const existingRows = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n const existing = existingRows.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Determine severity based on belief criticality\n let severity: \"critical\" | \"significant\" | \"minor\" = \"significant\";\n if (belief.criticality === \"blocking\") {\n severity = \"critical\";\n } else if (belief.criticality === \"supporting\") {\n severity = \"minor\";\n }\n\n if (existing) {\n // Update existing with any new evidence\n const newSupporting = supportingIds.filter(\n (id) => !existing.supportingInsightIds.includes(id)\n );\n const newContradicting = contradictingIds.filter(\n (id) => !existing.contradictingInsightIds.includes(id)\n );\n\n if (newSupporting.length > 0 || newContradicting.length > 0) {\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...existing.supportingInsightIds,\n ...newSupporting,\n ],\n contradictingInsightIds: [\n ...existing.contradictingInsightIds,\n ...newContradicting,\n ],\n severity,\n });\n updated++;\n }\n } else {\n // Create new contradiction\n await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: belief._id,\n supportingInsightIds: supportingIds,\n contradictingInsightIds: contradictingIds,\n source: DEFAULT_CONTRADICTION_SOURCE,\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n created++;\n }\n }\n }\n\n return { created, updated };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/contradictions.ts"],"names":["normalizeScopeValue","topicId","v"],"mappings":"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","file":"contradictions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","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 { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n>;\nexport type SoftResolvedScope = {\n topicId?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source?: ResolvedScope[\"source\"];\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\nexport async function resolveScope(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!topicId && !projectId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[scopeResolverCompat] Failed to resolve scope\",\n {\n error,\n topicId,\n projectId,\n },\n );\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Contradiction Detection & Surfacing (Phase 8.3)\n *\n * Contradictions are GOLD. When evidence conflicts for a belief,\n * that's a signal to dig deeper. This module detects, tracks, and\n * helps resolve contradictions in the belief system.\n */\n\nimport { v } from \"convex/values\";\nimport { internal } from \"./convex\";\nimport type { Doc, Id } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport { checkProjectAccess, requireProjectAccess } from \"@lucern/access-control/access\";\nimport { resolveScopeSoft, scopeArgs } from \"./scopeResolverCompat\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\n\n// IDs are now always epistemicNodes IDs (backfill complete)\nconst _beliefIdUnion = v.id(\"epistemicNodes\");\nconst _insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_CONTRADICTION_SOURCE = \"evidence_links\" as const;\nconst TUPLE_SPACE_CONTRADICTION_SOURCE = \"tuple_space\" as const;\n\nfunction contradictionSourceOf(\n contradiction: { source?: unknown } | null | undefined\n): \"evidence_links\" | \"tuple_space\" {\n return contradiction?.source === TUPLE_SPACE_CONTRADICTION_SOURCE\n ? TUPLE_SPACE_CONTRADICTION_SOURCE\n : DEFAULT_CONTRADICTION_SOURCE;\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Detect contradictions for a project\n * Finds beliefs that have both supporting AND contradicting evidence\n */\nexport const detectContradictions = query({\n args: {\n ...scopeArgs,\n includeResolved: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n // Get all beliefs from epistemic spine\n const beliefs = await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n );\n\n // Get all belief-evidence links\n const contradictionCandidates: Array<{\n beliefId: Id<\"epistemicNodes\">;\n belief: Doc<\"epistemicNodes\">;\n supportingInsights: Doc<\"epistemicNodes\">[];\n contradictingInsights: Doc<\"epistemicNodes\">[];\n existingContradiction?: Doc<\"contradictions\">;\n }> = [];\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n\n const supportingLinks = evidenceLinks.filter(\n (l) => l.relation === \"supports\"\n );\n const contradictingLinks = evidenceLinks.filter(\n (l) => l.relation === \"contradicts\"\n );\n\n // Only flag as contradiction if BOTH supporting AND contradicting evidence exists\n if (supportingLinks.length > 0 && contradictingLinks.length > 0) {\n // Fetch the actual insights\n const supportingInsights = await Promise.all(\n supportingLinks.map((l) => ctx.db.get(l.insightId))\n );\n const contradictingInsights = await Promise.all(\n contradictingLinks.map((l) => ctx.db.get(l.insightId))\n );\n\n // Check if there's already a tracked contradiction\n const existingContradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n const existingContradiction = existingContradictions.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Skip resolved contradictions unless explicitly requested\n if (\n existingContradiction &&\n !args.includeResolved &&\n existingContradiction.status !== \"unresolved\" &&\n existingContradiction.status !== \"investigating\"\n ) {\n continue;\n }\n\n contradictionCandidates.push({\n beliefId: belief._id,\n belief,\n supportingInsights: supportingInsights.filter(\n Boolean\n ) as Doc<\"epistemicNodes\">[],\n contradictingInsights: contradictingInsights.filter(\n Boolean\n ) as Doc<\"epistemicNodes\">[],\n existingContradiction: existingContradiction ?? undefined,\n });\n }\n }\n\n return contradictionCandidates;\n },\n});\n\n/**\n * Get all tracked contradictions for a project\n */\nexport const getByProject = query({\n args: {\n ...scopeArgs,\n userId: v.string(),\n status: v.optional(\n v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n )\n ),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const hasAccess = await checkProjectAccess(ctx, projectId, args.userId);\n if (!hasAccess) {\n return [];\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 200), 1000));\n const scanLimit = Math.min(pageSize * 3, 1000);\n\n let contradictions;\n\n if (args.status) {\n const status = args.status; // Capture in local variable for type narrowing\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", status)\n )\n .order(\"desc\")\n .take(scanLimit);\n } else {\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topicId\", (q) => q.eq(\"topicId\", String(scope.topicId ?? projectId)))\n .order(\"desc\")\n .take(scanLimit);\n }\n\n // Enrich with belief and insight data\n const enriched = await Promise.all(\n contradictions.slice(0, pageSize).map(async (c) => {\n const belief = await ctx.db.get(c.beliefId);\n const supportingInsights = await Promise.all(\n c.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n c.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...c,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n };\n })\n );\n\n return enriched;\n },\n});\n\n/**\n * Get unresolved contradiction count for dashboard\n */\nexport const getUnresolvedCount = query({\n args: {\n ...scopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", \"unresolved\")\n )\n .collect();\n\n const critical = contradictions.filter(\n (c) => c.severity === \"critical\"\n ).length;\n const significant = contradictions.filter(\n (c) => c.severity === \"significant\"\n ).length;\n const minor = contradictions.filter((c) => c.severity === \"minor\").length;\n\n return {\n total: contradictions.length,\n critical,\n significant,\n minor,\n };\n },\n});\n\n/**\n * Get a single contradiction with full context\n */\nexport const getById = query({\n args: { contradictionId: v.id(\"contradictions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const contradiction = await ctx.db.get(args.contradictionId);\n if (!contradiction) {\n return null;\n }\n\n const belief = await ctx.db.get(contradiction.beliefId);\n const supportingInsights = await Promise.all(\n contradiction.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n contradiction.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...contradiction,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n resolutionSprintId: (contradiction as any).resolutionSprintId ?? (contradiction as any).resolutionSprintId ?? null,\n };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Track a new contradiction\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n beliefId: v.id(\"epistemicNodes\"),\n beliefBId: v.optional(v.id(\"epistemicNodes\")),\n supportingInsightIds: v.array(v.id(\"epistemicNodes\")),\n contradictingInsightIds: v.array(v.id(\"epistemicNodes\")),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n source: v.optional(\n v.union(\n v.literal(\"evidence_links\"),\n v.literal(\"tuple_space\")\n )\n ),\n description: v.optional(v.string()),\n detectionMethod: v.optional(\n v.union(\n v.literal(\"semantic\"),\n v.literal(\"keyword\"),\n v.literal(\"manual\"),\n v.literal(\"agent\")\n )\n ),\n aiAnalysis: v.optional(\n v.object({\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n analyzedAt: v.number(),\n })\n ),\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n const source = args.source ?? DEFAULT_CONTRADICTION_SOURCE;\n\n // Evidence-link contradictions preserve the current \"merge evidence into the\n // active record\" behavior. Tuple-space contradictions are append-only and\n // should create a fresh record on each threshold crossing.\n const existingRows = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", args.beliefId))\n .collect();\n const existing = existingRows.find(\n (row) =>\n contradictionSourceOf(row) === source &&\n (args.beliefBId ? String((row as any).beliefBId ?? \"\") === String(args.beliefBId) : true)\n );\n\n if (existing && source !== TUPLE_SPACE_CONTRADICTION_SOURCE) {\n // Update existing contradiction with new evidence\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...new Set([\n ...existing.supportingInsightIds,\n ...args.supportingInsightIds,\n ]),\n ],\n contradictingInsightIds: [\n ...new Set([\n ...existing.contradictingInsightIds,\n ...args.contradictingInsightIds,\n ]),\n ],\n severity: args.severity,\n description: args.description ?? (existing as any).description,\n detectionMethod: args.detectionMethod ?? (existing as any).detectionMethod,\n aiAnalysis: args.aiAnalysis,\n });\n return existing._id;\n }\n\n // Create new contradiction\n return await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: args.beliefId,\n ...(args.beliefBId ? { beliefBId: args.beliefBId } : {}),\n supportingInsightIds: args.supportingInsightIds,\n contradictingInsightIds: args.contradictingInsightIds,\n source,\n ...(args.description ? { description: args.description } : {}),\n ...(args.detectionMethod ? { detectionMethod: args.detectionMethod } : {}),\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity: args.severity,\n aiAnalysis: args.aiAnalysis,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n },\n});\n\n/**\n * Update contradiction status\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateStatus = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n status: v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n resolutionSprintId: v.optional(v.string()),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId && args.userId) {\n await requireProjectAccess(ctx, existing.projectId, args.userId);\n }\n\n const now = Date.now();\n const update: Record<string, unknown> = { status: args.status };\n\n if (args.resolutionSprintId) {\n update.resolutionSprintId = args.resolutionSprintId;\n }\n\n if (\n args.status.startsWith(\"resolved_\") ||\n args.status === \"belief_forked\"\n ) {\n update.resolvedAt = now;\n }\n\n await ctx.db.patch(args.contradictionId, update);\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log all status changes to epistemicAudit\n // ============================================================\n if (existing.status !== args.status) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { status: existing.status },\n newState: {\n status: args.status,\n resolutionSprintId: args.resolutionSprintId,\n },\n rationale: `Contradiction status changed from ${existing.status} to ${args.status}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Resolve a contradiction with findings\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const resolve = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n verdict: v.string(),\n reasoning: v.string(),\n beliefUpdate: v.string(),\n resolvedBy: v.string(),\n newStatus: v.union(\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId) {\n await requireProjectAccess(ctx, existing.projectId, args.resolvedBy);\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.contradictionId, {\n status: args.newStatus,\n resolution: {\n verdict: args.verdict,\n reasoning: args.reasoning,\n beliefUpdate: args.beliefUpdate,\n resolvedBy: args.resolvedBy,\n },\n resolvedAt: now,\n });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log resolution to epistemicAudit with full context\n // ============================================================\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"resolved\",\n changedAt: now,\n changedBy: args.resolvedBy,\n isAgent: false,\n previousState: { status: existing.status },\n newState: {\n status: args.newStatus,\n verdict: args.verdict,\n beliefUpdate: args.beliefUpdate,\n },\n rationale: `Contradiction resolved: ${args.verdict}. Reasoning: ${args.reasoning}`,\n projectId: existing.projectId,\n });\n\n // Flywheel: After resolution, re-scan the affected belief neighborhood\n // Resolution may shift confidence, revealing new contradictions\n await ctx.scheduler.runAfter(\n 5000, // 5s delay\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: existing.beliefId as string,\n projectId: existing.projectId,\n }\n );\n\n return { success: true };\n },\n});\n\n/**\n * Update severity assessment\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateSeverity = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n const now = Date.now();\n await ctx.db.patch(args.contradictionId, { severity: args.severity });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log severity changes to epistemicAudit\n // ============================================================\n if (existing.severity !== args.severity) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"severity_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { severity: existing.severity },\n newState: { severity: args.severity },\n rationale: `Contradiction severity changed from ${existing.severity} to ${args.severity}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Add AI analysis to a contradiction\n */\nexport const addAiAnalysis = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.contradictionId, {\n aiAnalysis: {\n summary: args.summary,\n likelyExplanation: args.likelyExplanation,\n suggestedResolution: args.suggestedResolution,\n confidenceInAnalysis: args.confidenceInAnalysis,\n analyzedAt: Date.now(),\n },\n });\n return { success: true };\n },\n});\n\n/**\n * Scan project and auto-create contradictions for any beliefs with conflicting evidence\n * Called by cron job or manually\n */\nexport const scanAndCreateContradictions = mutation({\n args: {\n ...scopeArgs,\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return [] as any; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n\n // Get all beliefs from epistemic spine\n const beliefs = await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n );\n\n let created = 0;\n let updated = 0;\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n\n const supportingIds = evidenceLinks\n .filter((l) => l.relation === \"supports\")\n .map((l) => l.insightId);\n const contradictingIds = evidenceLinks\n .filter((l) => l.relation === \"contradicts\")\n .map((l) => l.insightId);\n\n // Only create contradiction if BOTH sides have evidence\n if (supportingIds.length > 0 && contradictingIds.length > 0) {\n // Check if contradiction already exists\n const existingRows = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q) => q.eq(\"beliefId\", belief._id))\n .collect();\n const existing = existingRows.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Determine severity based on belief criticality\n let severity: \"critical\" | \"significant\" | \"minor\" = \"significant\";\n if (belief.criticality === \"blocking\") {\n severity = \"critical\";\n } else if (belief.criticality === \"supporting\") {\n severity = \"minor\";\n }\n\n if (existing) {\n // Update existing with any new evidence\n const newSupporting = supportingIds.filter(\n (id) => !existing.supportingInsightIds.includes(id)\n );\n const newContradicting = contradictingIds.filter(\n (id) => !existing.contradictingInsightIds.includes(id)\n );\n\n if (newSupporting.length > 0 || newContradicting.length > 0) {\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...existing.supportingInsightIds,\n ...newSupporting,\n ],\n contradictingInsightIds: [\n ...existing.contradictingInsightIds,\n ...newContradicting,\n ],\n severity,\n });\n updated++;\n }\n } else {\n // Create new contradiction\n await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: belief._id,\n supportingInsightIds: supportingIds,\n contradictingInsightIds: contradictingIds,\n source: DEFAULT_CONTRADICTION_SOURCE,\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n created++;\n }\n }\n }\n\n return { created, updated };\n },\n});\n"]}
|
package/dist/debug.d.ts
ADDED
package/dist/debug.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/debug.ts
|
|
2
|
+
function isGraphPrimitiveDebugEnabled() {
|
|
3
|
+
const env = globalThis.process?.env;
|
|
4
|
+
return env?.LUCERN_COMPAT_FALLBACK_DEBUG === "1" || env?.LUCERN_GRAPH_DEBUG === "1";
|
|
5
|
+
}
|
|
6
|
+
function formatGraphPrimitiveError(error) {
|
|
7
|
+
if (error instanceof Error) {
|
|
8
|
+
return `${error.name}: ${error.message}`;
|
|
9
|
+
}
|
|
10
|
+
if (typeof error === "string") {
|
|
11
|
+
return error;
|
|
12
|
+
}
|
|
13
|
+
if (error === null) {
|
|
14
|
+
return "null";
|
|
15
|
+
}
|
|
16
|
+
if (error === void 0) {
|
|
17
|
+
return "undefined";
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
return JSON.stringify(error);
|
|
21
|
+
} catch {
|
|
22
|
+
return Object.prototype.toString.call(error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function debugGraphPrimitiveFallback(message, context) {
|
|
26
|
+
if (!isGraphPrimitiveDebugEnabled()) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.debug(message, context ?? {});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { debugGraphPrimitiveFallback, formatGraphPrimitiveError };
|
|
33
|
+
//# sourceMappingURL=debug.js.map
|
|
34
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/debug.ts"],"names":[],"mappings":";AAMA,SAAS,4BAAA,GAAwC;AAC/C,EAAA,MAAM,GAAA,GAAO,WAA8C,OAAA,EAAS,GAAA;AACpE,EAAA,OACE,GAAA,EAAK,4BAAA,KAAiC,GAAA,IACtC,GAAA,EAAK,kBAAA,KAAuB,GAAA;AAEhC;AAEO,SAAS,0BAA0B,KAAA,EAAwB;AAChE,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7C;AACF;AAEO,SAAS,2BAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,8BAA6B,EAAG;AACnC,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,OAAA,IAAW,EAAE,CAAA;AACtC","file":"debug.js","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/contradicts.ts"],"names":[],"mappings":";;;AAeO,SAAS,iBACd,IAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAK,UAAA,IAAc,MAAA;AAAA,IAC/B,aAAA,EAAe,KAAK,aAAA,IAAiB,MAAA;AAAA,IACrC,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,GAC3C;AACF;AAEO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;AA8BO,SAAS,oCAAA,CACd,aAAA,EACA,aAAA,EACA,UAAA,EACA,IAAA,EACmB;AACnB,EAAA,OAAO,oBAAA;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAiB,IAAI;AAAA,GACvB;AACF;;;ACpFO,IAAM,0BAAA,GAAkD;AAAA,EAC7D,QAAA,EAAU,aAAA;AAAA,EACV,SAAA,EAAW,eAAA;AAAA,EACX,YAAA,EAAc,MAAA;AAAA,EACd,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,iBAAiB,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,CAAC,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,oCAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"contradicts.js","sourcesContent":["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
|
|
1
|
+
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/contradicts.ts"],"names":[],"mappings":";;;AAeO,SAAS,iBACd,IAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAK,UAAA,IAAc,MAAA;AAAA,IAC/B,aAAA,EAAe,KAAK,aAAA,IAAiB,MAAA;AAAA,IACrC,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,GAC3C;AACF;AAEO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;AA8BO,SAAS,oCAAA,CACd,aAAA,EACA,aAAA,EACA,UAAA,EACA,IAAA,EACmB;AACnB,EAAA,OAAO,oBAAA;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAiB,IAAI;AAAA,GACvB;AACF;;;ACpFO,IAAM,0BAAA,GAAkD;AAAA,EAC7D,QAAA,EAAU,aAAA;AAAA,EACV,SAAA,EAAW,eAAA;AAAA,EACX,YAAA,EAAc,MAAA;AAAA,EACd,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,iBAAiB,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAU,CAAC,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,oCAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"contradicts.js","sourcesContent":["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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/dependsOn.ts"],"names":["project"],"mappings":";;;AAeO,SAAS,iBACd,IAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAK,UAAA,IAAc,MAAA;AAAA,IAC/B,aAAA,EAAe,KAAK,aAAA,IAAiB,MAAA;AAAA,IACrC,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,GAC3C;AACF;AAEO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;;;ACxCO,IAAM,wBAAA,GAAgD;AAAA,EAC3D,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,UAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,QAAA,GAAW,iBAAiB,IAAI,CAAA;AAEtC,IAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,eAAA,EAAiB;AACrD,MAAA,MAAM,cAAA,GAAiB,oBAAA;AAAA,QACrB,YAAA;AAAA,QACA,SAAA;AAAA,UACE,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa;AAAA,SACxB;AAAA,QACA,SAAA;AAAA,UACE,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB;AAAA,SAC3B;AAAA,QACA,aAAA,CAAc;AAAA,OAChB;AAEA,MAAA,OAAO,iBAAA;AAAA,QACL;AAAA,UACE,OAAA,EAAS,cAAA;AAAA,UACT,QAAA,EAAU,uBAAA;AAAA,UACV,WAAW,CAAA,uCAAA,EAA0CA,OAAAA;AAAA,YACnD;AAAA,WACF,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,SACd;AAAA,QACA,OAAA,CAAQ,IAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,uBAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAS,WAAA,IAAe;AAAA,KAC1B;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"dependsOn.js","sourcesContent":["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
|
|
1
|
+
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/dependsOn.ts"],"names":["project"],"mappings":";;;AAeO,SAAS,iBACd,IAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAK,UAAA,IAAc,MAAA;AAAA,IAC/B,aAAA,EAAe,KAAK,aAAA,IAAiB,MAAA;AAAA,IACrC,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,YAAA,EAAc,KAAK,YAAA,IAAgB,MAAA;AAAA,IACnC,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,GAC3C;AACF;AAEO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;;;ACxCO,IAAM,wBAAA,GAAgD;AAAA,EAC3D,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,UAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,QAAA,GAAW,iBAAiB,IAAI,CAAA;AAEtC,IAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,eAAA,EAAiB;AACrD,MAAA,MAAM,cAAA,GAAiB,oBAAA;AAAA,QACrB,YAAA;AAAA,QACA,SAAA;AAAA,UACE,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa,CAAA;AAAA,UACtB,SAAS,YAAA,CAAa;AAAA,SACxB;AAAA,QACA,SAAA;AAAA,UACE,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB,CAAA;AAAA,UACzB,SAAS,eAAA,CAAgB;AAAA,SAC3B;AAAA,QACA,aAAA,CAAc;AAAA,OAChB;AAEA,MAAA,OAAO,iBAAA;AAAA,QACL;AAAA,UACE,OAAA,EAAS,cAAA;AAAA,UACT,QAAA,EAAU,uBAAA;AAAA,UACV,WAAW,CAAA,uCAAA,EAA0CA,OAAAA;AAAA,YACnD;AAAA,WACF,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,SACd;AAAA,QACA,OAAA,CAAQ,IAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,uBAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAS,WAAA,IAAe;AAAA,KAC1B;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"dependsOn.js","sourcesContent":["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 {\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/elaborates.ts"],"names":[],"mappings":";;;AA2BO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;AAiBO,SAAS,uBAAA,CACd,aAAA,EACA,aAAA,EACA,UAAA,EACmB;AACnB,EAAA,MAAM,aAAa,aAAA,CAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AACpE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAA,CAAiB,aAAA,EAAe,UAAU,CAAA;AAAA,IACnD,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,CAAA,4BAAA,EAA+B,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,GACjE;AACF;;;ACtEO,IAAM,yBAAA,GAAiD;AAAA,EAC5D,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,UAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,gBAAA,GAAmB,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,IAAU,IAAI,CAAA,EAAG,IAAI,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,uBAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"elaborates.js","sourcesContent":["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
|
|
1
|
+
{"version":3,"sources":["../../src/edges/utils.ts","../../src/edges/elaborates.ts"],"names":[],"mappings":";;;AA2BO,SAAS,kBAAA,CACd,eACA,OAAA,EACW;AACX,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAC1D;AAEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,SAAA,EAAW,OAAO,GAAG,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,SAAA,EAAY,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClE;AAAA,KACD,CAAA,IAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAAA,GAC1B;AACF;AAiBO,SAAS,uBAAA,CACd,aAAA,EACA,aAAA,EACA,UAAA,EACmB;AACnB,EAAA,MAAM,aAAa,aAAA,CAAc,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AACpE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAA,CAAiB,aAAA,EAAe,UAAU,CAAA;AAAA,IACnD,QAAA,EAAU,mBAAA;AAAA,IACV,SAAA,EAAW,CAAA,4BAAA,EAA+B,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,GACjE;AACF;;;ACtEO,IAAM,yBAAA,GAAiD;AAAA,EAC5D,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,EAAW,UAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,MAAM,OAAA,KAAY;AACzD,IAAA,MAAM,YAAA,GAAe,kBAAA;AAAA,MACnB,aAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AACA,IAAA,MAAM,gBAAA,GAAmB,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,IAAU,IAAI,CAAA,EAAG,IAAI,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,uBAAA;AAAA,MACb,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,EAC5D,CAAA;AAAA,EACA,WAAA,EACE;AACJ","file":"elaborates.js","sourcesContent":["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 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"]}
|
package/dist/edges/index.js
CHANGED
|
@@ -59,9 +59,7 @@ function propagateNegativeSupportWithMetadata(sourceOpinion, targetOpinion, edge
|
|
|
59
59
|
readEdgeMetadata(edge)
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
return applyNegativeEvidence(sourceOpinion, targetOpinion, edgeWeight);
|
|
64
|
-
}
|
|
62
|
+
var propagateNegativeInform = applyNegativeEvidence;
|
|
65
63
|
|
|
66
64
|
// src/edges/contradicts.ts
|
|
67
65
|
var contradictsPropagationSpec = {
|
package/dist/edges/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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"],"names":["project"],"mappings":"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","file":"index.js","sourcesContent":["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 function propagateNegativeInform(\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edgeWeight: number\n): PropagationResult {\n return applyNegativeEvidence(sourceOpinion, targetOpinion, edgeWeight);\n}\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 PropagationTransitivity = \"none\" | \"damped\" | \"full\";\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: PropagationTransitivity;\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 PropagationTransitivity,\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\n"]}
|
|
1
|
+
{"version":3,"sources":["../../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"],"names":["project"],"mappings":"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","file":"index.js","sourcesContent":["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 PropagationTransitivity = \"none\" | \"damped\" | \"full\";\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: PropagationTransitivity;\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 PropagationTransitivity,\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\n"]}
|
package/dist/edges/informs.js
CHANGED
|
@@ -23,9 +23,7 @@ function propagatePositiveInform(sourceOpinion, targetOpinion, edgeWeight) {
|
|
|
23
23
|
rationale: `Supporting evidence (weight=${edgeWeight.toFixed(2)})`
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
return applyNegativeEvidence(sourceOpinion, targetOpinion, edgeWeight);
|
|
28
|
-
}
|
|
26
|
+
var propagateNegativeInform = applyNegativeEvidence;
|
|
29
27
|
|
|
30
28
|
// src/edges/informs.ts
|
|
31
29
|
var informsPropagationSpec = {
|