@lucern/graph-primitives 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -12
- package/dist/beliefDecay.js +24 -17
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +32 -8
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/contradictions.js +32 -9
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +55 -12
- package/dist/convex.js.map +1 -1
- package/dist/edgeValidation.d.ts +25 -2
- package/dist/edges/index.d.ts +9 -2
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/propagationTypes.d.ts +2 -3
- package/dist/edges/propagationTypes.js.map +1 -1
- package/dist/entityBridge.js +10 -3
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js +15 -3
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +36 -0
- package/dist/epistemicBeliefs.admin.js +745 -0
- package/dist/epistemicBeliefs.admin.js.map +1 -0
- package/dist/epistemicBeliefs.backfills.d.ts +62 -0
- package/dist/epistemicBeliefs.backfills.js +1004 -0
- package/dist/epistemicBeliefs.backfills.js.map +1 -0
- package/dist/epistemicBeliefs.confidence.d.ts +45 -0
- package/dist/epistemicBeliefs.confidence.js +1285 -0
- package/dist/epistemicBeliefs.confidence.js.map +1 -0
- package/dist/epistemicBeliefs.core.d.ts +35 -0
- package/dist/epistemicBeliefs.core.js +1508 -0
- package/dist/epistemicBeliefs.core.js.map +1 -0
- package/dist/epistemicBeliefs.d.ts +12 -3
- package/dist/epistemicBeliefs.helpers.d.ts +168 -0
- package/dist/epistemicBeliefs.helpers.js +1060 -0
- package/dist/epistemicBeliefs.helpers.js.map +1 -0
- package/dist/epistemicBeliefs.internal.d.ts +30 -0
- package/dist/epistemicBeliefs.internal.js +1329 -0
- package/dist/epistemicBeliefs.internal.js.map +1 -0
- package/dist/epistemicBeliefs.js +1196 -1184
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +19 -0
- package/dist/epistemicBeliefs.lifecycle.js +1608 -0
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -0
- package/dist/epistemicBeliefs.links.d.ts +30 -0
- package/dist/epistemicBeliefs.links.js +761 -0
- package/dist/epistemicBeliefs.links.js.map +1 -0
- package/dist/epistemicBeliefs.queries.d.ts +16 -0
- package/dist/epistemicBeliefs.queries.js +90 -0
- package/dist/epistemicBeliefs.queries.js.map +1 -0
- package/dist/epistemicContractHelpers.d.ts +1 -1
- package/dist/epistemicContractHelpers.js +1 -1
- package/dist/epistemicContracts.d.ts +5 -76
- package/dist/epistemicContracts.evaluators.d.ts +36 -0
- package/dist/epistemicContracts.evaluators.js +2506 -0
- package/dist/epistemicContracts.evaluators.js.map +1 -0
- package/dist/epistemicContracts.handlers.d.ts +40 -0
- package/dist/epistemicContracts.handlers.js +3029 -0
- package/dist/epistemicContracts.handlers.js.map +1 -0
- package/dist/epistemicContracts.js +2006 -5281
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +26 -0
- package/dist/epistemicContracts.metrics.js +427 -0
- package/dist/epistemicContracts.metrics.js.map +1 -0
- package/dist/epistemicContracts.types.d.ts +159 -0
- package/dist/epistemicContracts.types.js +3 -0
- package/dist/epistemicContracts.types.js.map +1 -0
- package/dist/epistemicEdgeCreation.d.ts +73 -0
- package/dist/epistemicEdgeCreation.js +450 -0
- package/dist/epistemicEdgeCreation.js.map +1 -0
- package/dist/epistemicEdges-BF-cn4i3.d.ts +43 -0
- package/dist/epistemicEdges.d.ts +8 -1
- package/dist/epistemicEdges.handlers.d.ts +20 -0
- package/dist/epistemicEdges.handlers.js +289 -0
- package/dist/epistemicEdges.handlers.js.map +1 -0
- package/dist/epistemicEdges.helpers.d.ts +27 -0
- package/dist/epistemicEdges.helpers.js +162 -0
- package/dist/epistemicEdges.helpers.js.map +1 -0
- package/dist/epistemicEdges.js +797 -875
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +39 -0
- package/dist/epistemicEdges.mutations.js +1365 -0
- package/dist/epistemicEdges.mutations.js.map +1 -0
- package/dist/epistemicEdges.queries.d.ts +95 -0
- package/dist/epistemicEdges.queries.js +851 -0
- package/dist/epistemicEdges.queries.js.map +1 -0
- package/dist/epistemicEdges.types.d.ts +32 -0
- package/dist/epistemicEdges.types.js +3 -0
- package/dist/epistemicEdges.types.js.map +1 -0
- package/dist/epistemicEvidence-DvfchNt7.d.ts +46 -0
- package/dist/epistemicEvidence.d.ts +5 -2
- package/dist/epistemicEvidence.js +801 -807
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +71 -0
- package/dist/epistemicEvidenceHelpers.js +769 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -0
- package/dist/epistemicEvidenceMutations.d.ts +10 -0
- package/dist/epistemicEvidenceMutations.js +1421 -0
- package/dist/epistemicEvidenceMutations.js.map +1 -0
- package/dist/epistemicEvidenceQueries.d.ts +10 -0
- package/dist/epistemicEvidenceQueries.js +1049 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -0
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +132 -127
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +138 -0
- package/dist/epistemicLayerRules.js +481 -0
- package/dist/epistemicLayerRules.js.map +1 -0
- package/dist/epistemicLinking.js +1 -1
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +101 -0
- package/dist/epistemicNodeCreation.js +709 -0
- package/dist/epistemicNodeCreation.js.map +1 -0
- package/dist/epistemicNodes-BCQxpYx_.d.ts +54 -0
- package/dist/epistemicNodes.d.ts +5 -1
- package/dist/epistemicNodes.helpers.d.ts +51 -0
- package/dist/epistemicNodes.helpers.js +73 -0
- package/dist/epistemicNodes.helpers.js.map +1 -0
- package/dist/epistemicNodes.internal.d.ts +34 -0
- package/dist/epistemicNodes.internal.js +658 -0
- package/dist/epistemicNodes.internal.js.map +1 -0
- package/dist/epistemicNodes.js +698 -693
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +34 -0
- package/dist/epistemicNodes.mutations.js +1153 -0
- package/dist/epistemicNodes.mutations.js.map +1 -0
- package/dist/epistemicNodes.queries.d.ts +36 -0
- package/dist/epistemicNodes.queries.js +619 -0
- package/dist/epistemicNodes.queries.js.map +1 -0
- package/dist/epistemicNodes.validators.d.ts +23 -0
- package/dist/epistemicNodes.validators.js +105 -0
- package/dist/epistemicNodes.validators.js.map +1 -0
- package/dist/epistemicQuestions-bwHd2FWE.d.ts +68 -0
- package/dist/epistemicQuestions.conviction.d.ts +52 -0
- package/dist/epistemicQuestions.conviction.js +1389 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -0
- package/dist/epistemicQuestions.create.d.ts +29 -0
- package/dist/epistemicQuestions.create.js +1300 -0
- package/dist/epistemicQuestions.create.js.map +1 -0
- package/dist/epistemicQuestions.d.ts +10 -2
- package/dist/epistemicQuestions.evidence.d.ts +22 -0
- package/dist/epistemicQuestions.evidence.js +929 -0
- package/dist/epistemicQuestions.evidence.js.map +1 -0
- package/dist/epistemicQuestions.helpers.d.ts +69 -0
- package/dist/epistemicQuestions.helpers.js +824 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -0
- package/dist/epistemicQuestions.js +2435 -2430
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +24 -0
- package/dist/epistemicQuestions.lifecycle.js +838 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -0
- package/dist/epistemicQuestions.queries.d.ts +41 -0
- package/dist/epistemicQuestions.queries.js +1013 -0
- package/dist/epistemicQuestions.queries.js.map +1 -0
- package/dist/epistemicQuestions.sprint.d.ts +22 -0
- package/dist/epistemicQuestions.sprint.js +757 -0
- package/dist/epistemicQuestions.sprint.js.map +1 -0
- package/dist/epistemicQuestions.tail.d.ts +42 -0
- package/dist/epistemicQuestions.tail.js +1345 -0
- package/dist/epistemicQuestions.tail.js.map +1 -0
- package/dist/epistemicSources.js +6 -2
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +2 -2
- package/dist/evaluators/index.js +45 -5320
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +1 -1
- package/dist/evaluators/sentryCheckerEvaluator.d.ts +1 -1
- package/dist/evaluators/testRunnerEvaluator.d.ts +1 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +1 -1
- package/dist/{graphTypes-CpgIuCdo.d.ts → graphTypes-B8VaIjnl.d.ts} +1 -1
- package/dist/graphTypes.d.ts +1 -1
- package/dist/{helpers-BYHIk5vU.d.ts → helpers-DNYfg6mo.d.ts} +2 -3
- package/dist/helpers.d.ts +2 -2
- package/dist/helpers.js.map +1 -1
- package/dist/{index-Dq-7R-gi.d.ts → index-C-Kyd7hD.d.ts} +1 -1
- package/dist/index.d.ts +160 -14
- package/dist/index.js +12291 -13001
- package/dist/index.js.map +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/ontologyApproval.js +1 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.js +25 -7
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/questionEvidenceLinks.js +28 -7
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -5
- package/dist/edgeValidation-CeI0wc0r.d.ts +0 -35
- package/dist/epistemicBeliefs-DzKjZAeC.d.ts +0 -377
- package/dist/epistemicEdges-CvlKnEyy.d.ts +0 -191
- package/dist/epistemicEvidence-xw6UUrwh.d.ts +0 -128
- package/dist/epistemicHelpers-DevrYgPN.d.ts +0 -329
- package/dist/epistemicNodes-DjSUfvyD.d.ts +0 -167
- package/dist/epistemicQuestions-B_nUclrH.d.ts +0 -214
- package/dist/index-Dct1T70K.d.ts +0 -25
|
@@ -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","../src/workspaceIsolation.ts","../src/confidencePropagationDispatch.ts"],"names":["project","mkOpinion"],"mappings":"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","file":"confidencePropagationDispatch.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","import {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\n};\n\nexport function normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction throwWorkspaceIsolationError(args: {\n message: string;\n invariantCode: string;\n suggestion: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = 409;\n error.code = \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function assertWorkspaceScopedEpistemicNodeScope(args: {\n scope: TopicProjectScope;\n nodeType: string;\n mutationName: string;\n}): void {\n const layer = isNodeType(args.nodeType)\n ? getLayerForNodeType(args.nodeType)\n : undefined;\n if (layer === \"ontological\") {\n return;\n }\n\n const workspaceId = normalizeScopeValue(args.scope.workspaceId);\n if (workspaceId) {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n \"Workspace-scoped reasoning isolation requires workspaceId on non-ontological node creation.\",\n invariantCode: \"workspace.scope_required_for_epistemic_nodes\",\n suggestion:\n \"Resolve the topic/project scope through a workspace-bound topic before creating epistemic nodes.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n topicId: args.scope.topicId,\n projectId: args.scope.projectId,\n },\n });\n}\n\nexport function nodeMatchesWorkspaceReasoningScope(\n node: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!node) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const nodeTenantId = normalizeScopeValue(node.tenantId);\n const nodeWorkspaceId = normalizeScopeValue(node.workspaceId);\n const epistemicLayer =\n typeof node.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n\n if (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\n return false;\n }\n\n // Ontological entities are tenant-global (no workspace required)\n if (epistemicLayer === \"ontological\" && nodeWorkspaceId === undefined) {\n return true;\n }\n\n // Published nodes are visible at tenant scope — the microservice API surface.\n // The node stays in its workspace, but tenant-scope queries can see it.\n if (!scopeWorkspaceId && node.publicationStatus === \"published\") {\n return true;\n }\n\n if (!scopeWorkspaceId) {\n return nodeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === nodeWorkspaceId;\n}\n\nexport function edgeMatchesWorkspaceReasoningScope(\n edge: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!edge) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const edgeTenantId = normalizeScopeValue(edge.tenantId);\n const edgeWorkspaceId = normalizeScopeValue(edge.workspaceId);\n\n if (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\n return false;\n }\n\n if (!scopeWorkspaceId) {\n return edgeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === edgeWorkspaceId;\n}\n\nexport async function resolveNodeScopeForWorkspaceIsolation(\n ctx: any,\n node: ScopeLike | null | undefined\n): Promise<{\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n nodeType?: string;\n}> {\n const epistemicLayer =\n typeof node?.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n const resolved = {\n tenantId: normalizeScopeValue(node?.tenantId),\n workspaceId: normalizeScopeValue(node?.workspaceId),\n epistemicLayer,\n nodeType: typeof node?.nodeType === \"string\" ? node.nodeType : undefined,\n };\n\n if (!node) {\n return resolved;\n }\n\n if (resolved.epistemicLayer === \"ontological\") {\n return resolved;\n }\n\n if (resolved.tenantId || resolved.workspaceId) {\n return resolved;\n }\n\n if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n if (node.projectId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n projectId: String(node.projectId),\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n return resolved;\n}\n\nexport function resolveRuntimePackMutationContext(args: {\n runtimeToolName?: string;\n runtimePackKey?: string;\n runtimePackInstallScope?: \"tenant\" | \"workspace\";\n}): RuntimePackMutationContext | undefined {\n if (\n !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\n ) {\n return;\n }\n\n return {\n toolName: args.runtimeToolName,\n packKey: args.runtimePackKey,\n packInstallScope: args.runtimePackInstallScope,\n };\n}\n\nexport function assertTenantPackWorkspaceMutationAllowed(args: {\n runtime?: RuntimePackMutationContext;\n target: ScopeLike;\n mutationName: string;\n}): void {\n if (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\n return;\n }\n\n const targetWorkspaceId = normalizeScopeValue(args.target.workspaceId);\n const targetLayer =\n typeof args.target.epistemicLayer === \"string\"\n ? args.target.epistemicLayer\n : undefined;\n\n if (!targetWorkspaceId || targetLayer === \"ontological\") {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n `Tenant-scoped pack \"${args.runtime.packKey}\" cannot mutate workspace-scoped reasoning state.`,\n invariantCode: \"workspace.tenant_pack_reasoning_write_forbidden\",\n suggestion:\n \"Use a workspace-scoped pack for workspace-local graph mutations, or route the change through tenant-global canonical entity flows.\",\n details: {\n mutationName: args.mutationName,\n toolName: args.runtime.toolName,\n packKey: args.runtime.packKey,\n targetWorkspaceId,\n targetNodeType: args.target.nodeType,\n targetLayer,\n },\n });\n}\n","import {\n hasProjectedOpinionChanged,\n mkOpinion,\n readOpinionFromRecord,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n getEdgePropagationSpecs,\n getTraversalDirections,\n type EdgePropagationSpec,\n type PropagationEdgeRecord,\n type PropagationEdgeType,\n type PropagationTraversalDirection,\n} from \"./edges\";\nimport {\n edgeMatchesWorkspaceReasoningScope,\n nodeMatchesWorkspaceReasoningScope,\n} from \"./workspaceIsolation\";\n\nexport type PropagationDispatchScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type PropagationDispatchNode<TNodeId extends string = string> = {\n _id?: TNodeId;\n nodeType?: string;\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n publicationStatus?: string;\n metadata?: unknown;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n opinion_a?: number;\n};\n\nexport type PropagationDispatchEdge<TNodeId extends string = string> =\n PropagationEdgeRecord<TNodeId>;\n\nexport type ConfidencePropagationDispatch<TNodeId extends string = string> = {\n targetNodeId: TNodeId;\n edgeType: PropagationEdgeType;\n traversedDirection: PropagationTraversalDirection;\n weight: number;\n opinion: SLOpinion;\n operator: SLOperator;\n rationale: string;\n hop: number;\n};\n\nfunction resolveTraversalTargetNodeId<TNodeId extends string>(\n edge: PropagationDispatchEdge<TNodeId>,\n direction: PropagationTraversalDirection\n): TNodeId | undefined {\n const targetNodeId =\n direction === \"outgoing\" ? edge.toNodeId : edge.fromNodeId;\n return targetNodeId ?? undefined;\n}\n\nfunction readNodeOpinion<TNodeId extends string>(\n node: PropagationDispatchNode<TNodeId>\n): SLOpinion {\n const metadata = (node.metadata ?? {}) as Record<string, unknown>;\n\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch {\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport async function collectConfidencePropagationDispatches<\n TNodeId extends string = string,\n>(args: {\n sourceNodeId: TNodeId;\n sourceOpinion: SLOpinion;\n sourceScope?: PropagationDispatchScope;\n traversalSpecs?: readonly EdgePropagationSpec<TNodeId>[];\n queryEdges: (args: {\n nodeId: TNodeId;\n spec: EdgePropagationSpec<TNodeId>;\n direction: PropagationTraversalDirection;\n hop: number;\n }) => Promise<ReadonlyArray<PropagationDispatchEdge<TNodeId>>>;\n getNode: (\n nodeId: TNodeId\n ) => Promise<PropagationDispatchNode<TNodeId> | null | undefined>;\n}): Promise<ConfidencePropagationDispatch<TNodeId>[]> {\n const dispatchesByTargetId = new Map<\n string,\n ConfidencePropagationDispatch<TNodeId>\n >();\n const opinionCache = new Map<string, SLOpinion>();\n const nodeCache = new Map<\n string,\n PropagationDispatchNode<TNodeId> | null | undefined\n >();\n const traversalSpecs = (args.traversalSpecs ??\n getEdgePropagationSpecs()) as readonly EdgePropagationSpec<TNodeId>[];\n const queue: Array<{\n nodeId: TNodeId;\n opinion: SLOpinion;\n hop: number;\n visitedNodeIds: Set<string>;\n }> = [\n {\n nodeId: args.sourceNodeId,\n opinion: args.sourceOpinion,\n hop: 0,\n visitedNodeIds: new Set([String(args.sourceNodeId)]),\n },\n ];\n\n const loadNode = async (nodeId: TNodeId) => {\n const cacheKey = String(nodeId);\n if (!nodeCache.has(cacheKey)) {\n nodeCache.set(cacheKey, await args.getNode(nodeId));\n }\n return nodeCache.get(cacheKey) ?? null;\n };\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) {\n continue;\n }\n\n for (const spec of traversalSpecs) {\n const nextHop = state.hop + 1;\n if (!canTraverseHop(spec, nextHop)) {\n continue;\n }\n\n for (const direction of getTraversalDirections(spec.direction)) {\n const edges = await args.queryEdges({\n nodeId: state.nodeId,\n spec,\n direction,\n hop: nextHop,\n });\n\n for (const edge of edges) {\n if (\n args.sourceScope &&\n !edgeMatchesWorkspaceReasoningScope(edge, args.sourceScope)\n ) {\n continue;\n }\n\n const targetNodeId = resolveTraversalTargetNodeId(edge, direction);\n if (!targetNodeId) {\n continue;\n }\n\n if (state.visitedNodeIds.has(String(targetNodeId))) {\n continue;\n }\n\n const targetNode = await loadNode(targetNodeId);\n if (!targetNode || targetNode.nodeType !== \"belief\") {\n continue;\n }\n\n if (\n args.sourceScope &&\n !nodeMatchesWorkspaceReasoningScope(targetNode, args.sourceScope)\n ) {\n continue;\n }\n\n const cacheKey = String(targetNodeId);\n const targetOpinion =\n opinionCache.get(cacheKey) ?? readNodeOpinion(targetNode);\n const result = spec.operator(state.opinion, targetOpinion, edge, {\n hop: nextHop,\n sourceNodeId: state.nodeId,\n targetNodeId,\n traversedDirection: direction,\n spec,\n });\n\n if (\n !result ||\n !hasProjectedOpinionChanged(targetOpinion, result.opinion)\n ) {\n continue;\n }\n\n const projectedOpinion = mkOpinion(\n result.opinion.b,\n result.opinion.d,\n result.opinion.u,\n result.opinion.a\n );\n\n opinionCache.set(cacheKey, projectedOpinion);\n\n const existingDispatch = dispatchesByTargetId.get(cacheKey);\n dispatchesByTargetId.set(cacheKey, {\n targetNodeId,\n edgeType: spec.edgeType,\n traversedDirection: direction,\n weight: edge.weight ?? 1,\n opinion: projectedOpinion,\n operator: result.operator,\n rationale: existingDispatch\n ? `${existingDispatch.rationale}; ${result.rationale}`\n : result.rationale,\n hop: nextHop,\n });\n\n if (canContinueTransitively(spec, nextHop)) {\n queue.push({\n nodeId: targetNodeId,\n opinion: projectedOpinion,\n hop: nextHop,\n visitedNodeIds: new Set([\n ...state.visitedNodeIds,\n String(targetNodeId),\n ]),\n });\n }\n }\n }\n }\n }\n\n return Array.from(dispatchesByTargetId.values()).sort((left, right) => {\n if (left.hop !== right.hop) {\n return left.hop - right.hop;\n }\n return String(left.targetNodeId).localeCompare(String(right.targetNodeId));\n });\n}\n"]}
|
|
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","../src/workspaceIsolation.ts","../src/confidencePropagationDispatch.ts"],"names":["project","mkOpinion"],"mappings":"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","file":"confidencePropagationDispatch.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 PropagationEdgeType =\n | \"supports\"\n | \"depends_on\"\n | \"informs\"\n | \"contains\"\n | \"tests\"\n | \"derived_from\"\n | \"contradicts\"\n | \"refutes\"\n | \"elaborates\";\n\nexport type PropagationEdgeRecord<TNodeId extends string = string> = {\n fromNodeId?: TNodeId | null;\n toNodeId?: TNodeId | null;\n edgeType: string;\n weight?: number | null;\n constraint?: EdgeMetadata[\"constraint\"] | null;\n normalization?: EdgeMetadata[\"normalization\"] | null;\n propagation?: EdgeMetadata[\"propagation\"] | null;\n conditionalA?: EdgeMetadata[\"conditionalA\"] | null;\n conditionalNotA?: EdgeMetadata[\"conditionalNotA\"] | null;\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type EdgePropagationSpec<TNodeId extends string = string> = {\n edgeType: PropagationEdgeType;\n direction: PropagationSpecDirection;\n transitivity: \"none\" | \"damped\" | \"full\";\n damping: number;\n maxHops: number | \"unbounded\";\n operator: (\n sourceOpinion: SLOpinion,\n targetOpinion: SLOpinion,\n edge: PropagationEdgeRecord<TNodeId>,\n context: {\n hop: number;\n sourceNodeId: TNodeId;\n targetNodeId: TNodeId;\n traversedDirection: PropagationTraversalDirection;\n spec: EdgePropagationSpec<TNodeId>;\n }\n ) => PropagationResult | null;\n description: string;\n};\n\nexport function isPropagationTraversalDirection(\n direction: string\n): direction is PropagationTraversalDirection {\n return direction === \"outgoing\" || direction === \"incoming\";\n}\n\nexport function canTraverseHop<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n nextHop: number\n): boolean {\n return spec.maxHops === \"unbounded\" || nextHop <= spec.maxHops;\n}\n\nexport function canContinueTransitively<TNodeId extends string>(\n spec: EdgePropagationSpec<TNodeId>,\n currentHop: number\n): boolean {\n if (spec.transitivity === \"none\") {\n return false;\n }\n\n return spec.maxHops === \"unbounded\" || currentHop < spec.maxHops;\n}\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeInform,\n} from \"./utils\";\n\nexport const refutesPropagationSpec: EdgePropagationSpec = {\n edgeType: \"refutes\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 0.9,\n maxHops: 1,\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const negativeWeight = -Math.abs(edge.weight ?? 1);\n const result = propagateNegativeInform(\n dampedSource,\n targetOpinion,\n negativeWeight\n );\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Explicit negative evidence semantics. Refutes is treated as strong one-hop counter-evidence.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\nimport {\n annotateRationale,\n applyPerHopDamping,\n propagateNegativeSupportWithMetadata,\n propagatePositiveSupport,\n} from \"./utils\";\n\nexport const supportsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"supports\",\n direction: \"outgoing\",\n transitivity: \"full\",\n damping: 0.85,\n maxHops: \"unbounded\",\n operator: (sourceOpinion, targetOpinion, edge, context) => {\n const dampedSource = applyPerHopDamping(\n sourceOpinion,\n context.spec.damping\n );\n const weight = edge.weight ?? 1;\n const result =\n weight < 0\n ? propagateNegativeSupportWithMetadata(\n dampedSource,\n targetOpinion,\n weight,\n edge\n )\n : propagatePositiveSupport(dampedSource, targetOpinion, weight);\n\n return annotateRationale(result, context.spec, context.hop);\n },\n description:\n \"Belief-to-belief influence. Supports chains transitively with moderate per-hop damping.\",\n};\n\n","import type { EdgePropagationSpec } from \"./propagationTypes\";\n\nexport const testsPropagationSpec: EdgePropagationSpec = {\n edgeType: \"tests\",\n direction: \"outgoing\",\n transitivity: \"none\",\n damping: 1,\n maxHops: 1,\n operator: () => null,\n description:\n \"Interrogation linkage only. Tests edges do not directly move confidence.\",\n};\n\n","import { containsPropagationSpec } from \"./contains\";\nimport { contradictsPropagationSpec } from \"./contradicts\";\nimport { dependsOnPropagationSpec } from \"./dependsOn\";\nimport { derivedFromPropagationSpec } from \"./derivedFrom\";\nimport { elaboratesPropagationSpec } from \"./elaborates\";\nimport { informsPropagationSpec } from \"./informs\";\nimport type {\n EdgePropagationSpec,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\nimport { refutesPropagationSpec } from \"./refutes\";\nimport { supportsPropagationSpec } from \"./supports\";\nimport { testsPropagationSpec } from \"./tests\";\n\nexport type {\n EdgePropagationSpec,\n PropagationEdgeRecord,\n PropagationEdgeType,\n PropagationSpecDirection,\n PropagationTraversalDirection,\n} from \"./propagationTypes\";\nexport {\n canContinueTransitively,\n canTraverseHop,\n isPropagationTraversalDirection,\n} from \"./propagationTypes\";\n\nexport const EDGE_PROPAGATION_SPECS: readonly EdgePropagationSpec[] = [\n supportsPropagationSpec,\n informsPropagationSpec,\n dependsOnPropagationSpec,\n derivedFromPropagationSpec,\n containsPropagationSpec,\n testsPropagationSpec,\n contradictsPropagationSpec,\n refutesPropagationSpec,\n elaboratesPropagationSpec,\n] as const;\n\nconst EDGE_PROPAGATION_SPEC_MAP = new Map<\n PropagationEdgeType,\n EdgePropagationSpec\n>(EDGE_PROPAGATION_SPECS.map((spec) => [spec.edgeType, spec]));\n\nexport function getEdgePropagationSpec(\n edgeType: string\n): EdgePropagationSpec | undefined {\n return EDGE_PROPAGATION_SPEC_MAP.get(edgeType as PropagationEdgeType);\n}\n\nexport function getEdgePropagationSpecs(): readonly EdgePropagationSpec[] {\n return EDGE_PROPAGATION_SPECS;\n}\n\nexport function getTraversalDirections(\n direction: PropagationSpecDirection\n): readonly PropagationTraversalDirection[] {\n if (isPropagationTraversalDirection(direction)) {\n return [direction];\n }\n\n return [\"outgoing\", \"incoming\"];\n}\n","import {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\n};\n\nexport function normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction throwWorkspaceIsolationError(args: {\n message: string;\n invariantCode: string;\n suggestion: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = 409;\n error.code = \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function assertWorkspaceScopedEpistemicNodeScope(args: {\n scope: TopicProjectScope;\n nodeType: string;\n mutationName: string;\n}): void {\n const layer = isNodeType(args.nodeType)\n ? getLayerForNodeType(args.nodeType)\n : undefined;\n if (layer === \"ontological\") {\n return;\n }\n\n const workspaceId = normalizeScopeValue(args.scope.workspaceId);\n if (workspaceId) {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n \"Workspace-scoped reasoning isolation requires workspaceId on non-ontological node creation.\",\n invariantCode: \"workspace.scope_required_for_epistemic_nodes\",\n suggestion:\n \"Resolve the topic/project scope through a workspace-bound topic before creating epistemic nodes.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n topicId: args.scope.topicId,\n projectId: args.scope.projectId,\n },\n });\n}\n\nexport function nodeMatchesWorkspaceReasoningScope(\n node: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!node) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const nodeTenantId = normalizeScopeValue(node.tenantId);\n const nodeWorkspaceId = normalizeScopeValue(node.workspaceId);\n const epistemicLayer =\n typeof node.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n\n if (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\n return false;\n }\n\n // Ontological entities are tenant-global (no workspace required)\n if (epistemicLayer === \"ontological\" && nodeWorkspaceId === undefined) {\n return true;\n }\n\n // Published nodes are visible at tenant scope — the microservice API surface.\n // The node stays in its workspace, but tenant-scope queries can see it.\n if (!scopeWorkspaceId && node.publicationStatus === \"published\") {\n return true;\n }\n\n if (!scopeWorkspaceId) {\n return nodeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === nodeWorkspaceId;\n}\n\nexport function edgeMatchesWorkspaceReasoningScope(\n edge: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!edge) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const edgeTenantId = normalizeScopeValue(edge.tenantId);\n const edgeWorkspaceId = normalizeScopeValue(edge.workspaceId);\n\n if (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\n return false;\n }\n\n if (!scopeWorkspaceId) {\n return edgeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === edgeWorkspaceId;\n}\n\nexport async function resolveNodeScopeForWorkspaceIsolation(\n ctx: any,\n node: ScopeLike | null | undefined\n): Promise<{\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n nodeType?: string;\n}> {\n const epistemicLayer =\n typeof node?.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n const resolved = {\n tenantId: normalizeScopeValue(node?.tenantId),\n workspaceId: normalizeScopeValue(node?.workspaceId),\n epistemicLayer,\n nodeType: typeof node?.nodeType === \"string\" ? node.nodeType : undefined,\n };\n\n if (!node) {\n return resolved;\n }\n\n if (resolved.epistemicLayer === \"ontological\") {\n return resolved;\n }\n\n if (resolved.tenantId || resolved.workspaceId) {\n return resolved;\n }\n\n if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n if (node.projectId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n projectId: String(node.projectId),\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n return resolved;\n}\n\nexport function resolveRuntimePackMutationContext(args: {\n runtimeToolName?: string;\n runtimePackKey?: string;\n runtimePackInstallScope?: \"tenant\" | \"workspace\";\n}): RuntimePackMutationContext | undefined {\n if (\n !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\n ) {\n return;\n }\n\n return {\n toolName: args.runtimeToolName,\n packKey: args.runtimePackKey,\n packInstallScope: args.runtimePackInstallScope,\n };\n}\n\nexport function assertTenantPackWorkspaceMutationAllowed(args: {\n runtime?: RuntimePackMutationContext;\n target: ScopeLike;\n mutationName: string;\n}): void {\n if (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\n return;\n }\n\n const targetWorkspaceId = normalizeScopeValue(args.target.workspaceId);\n const targetLayer =\n typeof args.target.epistemicLayer === \"string\"\n ? args.target.epistemicLayer\n : undefined;\n\n if (!targetWorkspaceId || targetLayer === \"ontological\") {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n `Tenant-scoped pack \"${args.runtime.packKey}\" cannot mutate workspace-scoped reasoning state.`,\n invariantCode: \"workspace.tenant_pack_reasoning_write_forbidden\",\n suggestion:\n \"Use a workspace-scoped pack for workspace-local graph mutations, or route the change through tenant-global canonical entity flows.\",\n details: {\n mutationName: args.mutationName,\n toolName: args.runtime.toolName,\n packKey: args.runtime.packKey,\n targetWorkspaceId,\n targetNodeType: args.target.nodeType,\n targetLayer,\n },\n });\n}\n","import {\n hasProjectedOpinionChanged,\n mkOpinion,\n readOpinionFromRecord,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n canContinueTransitively,\n canTraverseHop,\n getEdgePropagationSpecs,\n getTraversalDirections,\n type EdgePropagationSpec,\n type PropagationEdgeRecord,\n type PropagationEdgeType,\n type PropagationTraversalDirection,\n} from \"./edges\";\nimport {\n edgeMatchesWorkspaceReasoningScope,\n nodeMatchesWorkspaceReasoningScope,\n} from \"./workspaceIsolation\";\n\nexport type PropagationDispatchScope = {\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type PropagationDispatchNode<TNodeId extends string = string> = {\n _id?: TNodeId;\n nodeType?: string;\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n publicationStatus?: string;\n metadata?: unknown;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n opinion_a?: number;\n};\n\nexport type PropagationDispatchEdge<TNodeId extends string = string> =\n PropagationEdgeRecord<TNodeId>;\n\nexport type ConfidencePropagationDispatch<TNodeId extends string = string> = {\n targetNodeId: TNodeId;\n edgeType: PropagationEdgeType;\n traversedDirection: PropagationTraversalDirection;\n weight: number;\n opinion: SLOpinion;\n operator: SLOperator;\n rationale: string;\n hop: number;\n};\n\nfunction resolveTraversalTargetNodeId<TNodeId extends string>(\n edge: PropagationDispatchEdge<TNodeId>,\n direction: PropagationTraversalDirection\n): TNodeId | undefined {\n const targetNodeId =\n direction === \"outgoing\" ? edge.toNodeId : edge.fromNodeId;\n return targetNodeId ?? undefined;\n}\n\nfunction readNodeOpinion<TNodeId extends string>(\n node: PropagationDispatchNode<TNodeId>\n): SLOpinion {\n const metadata = (node.metadata ?? {}) as Record<string, unknown>;\n\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch {\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport async function collectConfidencePropagationDispatches<\n TNodeId extends string = string,\n>(args: {\n sourceNodeId: TNodeId;\n sourceOpinion: SLOpinion;\n sourceScope?: PropagationDispatchScope;\n traversalSpecs?: readonly EdgePropagationSpec<TNodeId>[];\n queryEdges: (args: {\n nodeId: TNodeId;\n spec: EdgePropagationSpec<TNodeId>;\n direction: PropagationTraversalDirection;\n hop: number;\n }) => Promise<ReadonlyArray<PropagationDispatchEdge<TNodeId>>>;\n getNode: (\n nodeId: TNodeId\n ) => Promise<PropagationDispatchNode<TNodeId> | null | undefined>;\n}): Promise<ConfidencePropagationDispatch<TNodeId>[]> {\n const dispatchesByTargetId = new Map<\n string,\n ConfidencePropagationDispatch<TNodeId>\n >();\n const opinionCache = new Map<string, SLOpinion>();\n const nodeCache = new Map<\n string,\n PropagationDispatchNode<TNodeId> | null | undefined\n >();\n const traversalSpecs = (args.traversalSpecs ??\n getEdgePropagationSpecs()) as readonly EdgePropagationSpec<TNodeId>[];\n const queue: Array<{\n nodeId: TNodeId;\n opinion: SLOpinion;\n hop: number;\n visitedNodeIds: Set<string>;\n }> = [\n {\n nodeId: args.sourceNodeId,\n opinion: args.sourceOpinion,\n hop: 0,\n visitedNodeIds: new Set([String(args.sourceNodeId)]),\n },\n ];\n\n const loadNode = async (nodeId: TNodeId) => {\n const cacheKey = String(nodeId);\n if (!nodeCache.has(cacheKey)) {\n nodeCache.set(cacheKey, await args.getNode(nodeId));\n }\n return nodeCache.get(cacheKey) ?? null;\n };\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) {\n continue;\n }\n\n for (const spec of traversalSpecs) {\n const nextHop = state.hop + 1;\n if (!canTraverseHop(spec, nextHop)) {\n continue;\n }\n\n for (const direction of getTraversalDirections(spec.direction)) {\n const edges = await args.queryEdges({\n nodeId: state.nodeId,\n spec,\n direction,\n hop: nextHop,\n });\n\n for (const edge of edges) {\n if (\n args.sourceScope &&\n !edgeMatchesWorkspaceReasoningScope(edge, args.sourceScope)\n ) {\n continue;\n }\n\n const targetNodeId = resolveTraversalTargetNodeId(edge, direction);\n if (!targetNodeId) {\n continue;\n }\n\n if (state.visitedNodeIds.has(String(targetNodeId))) {\n continue;\n }\n\n const targetNode = await loadNode(targetNodeId);\n if (!targetNode || targetNode.nodeType !== \"belief\") {\n continue;\n }\n\n if (\n args.sourceScope &&\n !nodeMatchesWorkspaceReasoningScope(targetNode, args.sourceScope)\n ) {\n continue;\n }\n\n const cacheKey = String(targetNodeId);\n const targetOpinion =\n opinionCache.get(cacheKey) ?? readNodeOpinion(targetNode);\n const result = spec.operator(state.opinion, targetOpinion, edge, {\n hop: nextHop,\n sourceNodeId: state.nodeId,\n targetNodeId,\n traversedDirection: direction,\n spec,\n });\n\n if (\n !result ||\n !hasProjectedOpinionChanged(targetOpinion, result.opinion)\n ) {\n continue;\n }\n\n const projectedOpinion = mkOpinion(\n result.opinion.b,\n result.opinion.d,\n result.opinion.u,\n result.opinion.a\n );\n\n opinionCache.set(cacheKey, projectedOpinion);\n\n const existingDispatch = dispatchesByTargetId.get(cacheKey);\n dispatchesByTargetId.set(cacheKey, {\n targetNodeId,\n edgeType: spec.edgeType,\n traversedDirection: direction,\n weight: edge.weight ?? 1,\n opinion: projectedOpinion,\n operator: result.operator,\n rationale: existingDispatch\n ? `${existingDispatch.rationale}; ${result.rationale}`\n : result.rationale,\n hop: nextHop,\n });\n\n if (canContinueTransitively(spec, nextHop)) {\n queue.push({\n nodeId: targetNodeId,\n opinion: projectedOpinion,\n hop: nextHop,\n visitedNodeIds: new Set([\n ...state.visitedNodeIds,\n String(targetNodeId),\n ]),\n });\n }\n }\n }\n }\n }\n\n return Array.from(dispatchesByTargetId.values()).sort((left, right) => {\n if (left.hop !== right.hop) {\n return left.hop - right.hop;\n }\n return String(left.targetNodeId).localeCompare(String(right.targetNodeId));\n });\n}\n"]}
|
package/dist/contradictions.js
CHANGED
|
@@ -325,7 +325,10 @@ var detectContradictions = query({
|
|
|
325
325
|
);
|
|
326
326
|
const contradictionCandidates = [];
|
|
327
327
|
for (const belief of beliefs) {
|
|
328
|
-
const evidenceLinks = await ctx.db.query("beliefEvidenceLinks").withIndex(
|
|
328
|
+
const evidenceLinks = await ctx.db.query("beliefEvidenceLinks").withIndex(
|
|
329
|
+
"by_beliefId",
|
|
330
|
+
(q) => q.eq("beliefId", belief._id)
|
|
331
|
+
).collect();
|
|
329
332
|
const supportingLinks = evidenceLinks.filter(
|
|
330
333
|
(l) => l.relation === "supports"
|
|
331
334
|
);
|
|
@@ -339,7 +342,10 @@ var detectContradictions = query({
|
|
|
339
342
|
const contradictingInsights = await Promise.all(
|
|
340
343
|
contradictingLinks.map((l) => ctx.db.get(l.insightId))
|
|
341
344
|
);
|
|
342
|
-
const existingContradictions = await ctx.db.query("contradictions").withIndex(
|
|
345
|
+
const existingContradictions = await ctx.db.query("contradictions").withIndex(
|
|
346
|
+
"by_beliefId",
|
|
347
|
+
(q) => q.eq("beliefId", belief._id)
|
|
348
|
+
).collect();
|
|
343
349
|
const existingContradiction = existingContradictions.find(
|
|
344
350
|
(candidate) => contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE
|
|
345
351
|
);
|
|
@@ -398,7 +404,10 @@ var getByProject = query({
|
|
|
398
404
|
(q) => q.eq("topicId", String(scope.topicId ?? projectId)).eq("status", status)
|
|
399
405
|
).order("desc").take(scanLimit);
|
|
400
406
|
} else {
|
|
401
|
-
contradictions = await ctx.db.query("contradictions").withIndex(
|
|
407
|
+
contradictions = await ctx.db.query("contradictions").withIndex(
|
|
408
|
+
"by_topicId",
|
|
409
|
+
(q) => q.eq("topicId", String(scope.topicId ?? projectId))
|
|
410
|
+
).order("desc").take(scanLimit);
|
|
402
411
|
}
|
|
403
412
|
const enriched = await Promise.all(
|
|
404
413
|
contradictions.slice(0, pageSize).map(async (c) => {
|
|
@@ -429,7 +438,12 @@ var getUnresolvedCount = query({
|
|
|
429
438
|
const scope = await resolveScopeSoft(ctx, args);
|
|
430
439
|
const projectId = scope.projectId;
|
|
431
440
|
if (!projectId) {
|
|
432
|
-
return
|
|
441
|
+
return {
|
|
442
|
+
total: 0,
|
|
443
|
+
critical: 0,
|
|
444
|
+
significant: 0,
|
|
445
|
+
minor: 0
|
|
446
|
+
};
|
|
433
447
|
}
|
|
434
448
|
const contradictions = await ctx.db.query("contradictions").withIndex(
|
|
435
449
|
"by_topic_status",
|
|
@@ -470,7 +484,7 @@ var getById = query({
|
|
|
470
484
|
belief,
|
|
471
485
|
supportingInsights: supportingInsights.filter(Boolean),
|
|
472
486
|
contradictingInsights: contradictingInsights.filter(Boolean),
|
|
473
|
-
resolutionSprintId: contradiction.resolutionSprintId ??
|
|
487
|
+
resolutionSprintId: contradiction.resolutionSprintId ?? null
|
|
474
488
|
};
|
|
475
489
|
}
|
|
476
490
|
});
|
|
@@ -517,7 +531,10 @@ var create = mutation({
|
|
|
517
531
|
const scope = await resolveScopeSoft(ctx, args);
|
|
518
532
|
const projectId = scope.projectId;
|
|
519
533
|
if (!projectId) {
|
|
520
|
-
return
|
|
534
|
+
return {
|
|
535
|
+
created: 0,
|
|
536
|
+
updated: 0
|
|
537
|
+
};
|
|
521
538
|
}
|
|
522
539
|
const now = Date.now();
|
|
523
540
|
const source = args.source ?? DEFAULT_CONTRADICTION_SOURCE;
|
|
@@ -748,7 +765,7 @@ var scanAndCreateContradictions = mutation({
|
|
|
748
765
|
const scope = await resolveScopeSoft(ctx, args);
|
|
749
766
|
const projectId = scope.projectId;
|
|
750
767
|
if (!projectId) {
|
|
751
|
-
return
|
|
768
|
+
return { created: 0, updated: 0 };
|
|
752
769
|
}
|
|
753
770
|
const now = Date.now();
|
|
754
771
|
const beliefs = await ctx.runQuery(
|
|
@@ -760,11 +777,17 @@ var scanAndCreateContradictions = mutation({
|
|
|
760
777
|
let created = 0;
|
|
761
778
|
let updated = 0;
|
|
762
779
|
for (const belief of beliefs) {
|
|
763
|
-
const evidenceLinks = await ctx.db.query("beliefEvidenceLinks").withIndex(
|
|
780
|
+
const evidenceLinks = await ctx.db.query("beliefEvidenceLinks").withIndex(
|
|
781
|
+
"by_beliefId",
|
|
782
|
+
(q) => q.eq("beliefId", belief._id)
|
|
783
|
+
).collect();
|
|
764
784
|
const supportingIds = evidenceLinks.filter((l) => l.relation === "supports").map((l) => l.insightId);
|
|
765
785
|
const contradictingIds = evidenceLinks.filter((l) => l.relation === "contradicts").map((l) => l.insightId);
|
|
766
786
|
if (supportingIds.length > 0 && contradictingIds.length > 0) {
|
|
767
|
-
const existingRows = await ctx.db.query("contradictions").withIndex(
|
|
787
|
+
const existingRows = await ctx.db.query("contradictions").withIndex(
|
|
788
|
+
"by_beliefId",
|
|
789
|
+
(q) => q.eq("beliefId", belief._id)
|
|
790
|
+
).collect();
|
|
768
791
|
const existing = existingRows.find(
|
|
769
792
|
(candidate) => contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE
|
|
770
793
|
);
|