@lucern/graph-primitives 1.0.22 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/beliefDecay.js +49 -0
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +99 -5
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.js +50 -5
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/contradictions.js +46 -0
- package/dist/contradictions.js.map +1 -1
- package/dist/edgeValidation.js +66 -1
- package/dist/edgeValidation.js.map +1 -1
- package/dist/entityBridge.js +66 -1
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +40 -0
- package/dist/entityCanonicalMatch.js +33 -0
- package/dist/entityCanonicalMatch.js.map +1 -0
- package/dist/entityLifecycle.js +149 -39
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +64 -11
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.js +63 -6
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.js +59 -2
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +1 -1
- package/dist/epistemicBeliefs.confidence.js +70 -12
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +120 -17
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +1 -1
- package/dist/epistemicBeliefs.forkEvidence.js +13 -2
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +18 -3
- package/dist/epistemicBeliefs.helpers.js +66 -6
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +115 -12
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +132 -28
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.js +70 -12
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.js +111 -10
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.js +48 -8
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.evaluators.js +70 -12
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.js +71 -16
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +71 -16
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.d.ts +1 -1
- package/dist/epistemicEdges.handlers.js +57 -3
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +2 -2
- package/dist/epistemicEdges.js +174 -4
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.js +115 -1
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.js +46 -0
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +1 -1
- package/dist/epistemicEvidence.d.ts +1 -1
- package/dist/epistemicEvidence.js +180 -14
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +1 -1
- package/dist/epistemicEvidenceHelpers.js +49 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +180 -14
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.js +49 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.js +11 -6
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +8 -0
- package/dist/epistemicInsert.js +54 -0
- package/dist/epistemicInsert.js.map +1 -0
- package/dist/epistemicNodeCreation.js +11 -6
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/epistemicNodes.helpers.d.ts +1 -1
- package/dist/epistemicNodes.internal.js +53 -1
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +56 -4
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.js +55 -3
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.js +46 -0
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +1 -1
- package/dist/epistemicQuestions.conviction.js +49 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.js +61 -7
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +1 -1
- package/dist/epistemicQuestions.evidence.js +56 -2
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +1 -1
- package/dist/epistemicQuestions.helpers.js +49 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +63 -9
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.js +49 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.js +49 -0
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.js +46 -0
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.js +56 -2
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/epistemicSources.js +53 -2
- package/dist/epistemicSources.js.map +1 -1
- package/dist/helpers.js +66 -1
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +379 -115
- package/dist/index.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +49 -0
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js +3 -0
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +1 -1
- package/dist/scopeResolverCompat.js +46 -0
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +4 -0
- package/dist/topicProjectOverlay.js +3 -0
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
- package/dist/topicScope.d.ts +1 -1
- package/dist/topicScope.js +46 -0
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.js +46 -0
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +1 -1
- package/dist/workspaceIsolation.js +46 -0
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
package/dist/epistemicBeliefs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
1
|
+
import { v, ConvexError } from 'convex/values';
|
|
2
2
|
import { normalizeTupleContradictionPolicy, mkOpinion, createInheritedContractRecord, confidenceFromSL, conditionalDeduction, project, dampedDependencyCascade, hasProjectedOpinionChanged, detectTupleContradiction, evaluateTupleContradictionTransition, readOpinionFromRecord, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence } from '@lucern/confidence';
|
|
3
3
|
import { checkScopeAccess, checkProjectAccess } from '@lucern/access-control/access';
|
|
4
4
|
import { canAudienceClassAccess, normalizeAudienceKey, classFromAudienceKey } from '@lucern/access-control/audience';
|
|
@@ -7,7 +7,8 @@ import { componentsGeneric, anyApi, internalMutationGeneric, mutationGeneric, qu
|
|
|
7
7
|
import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
8
8
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
9
9
|
import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
|
|
10
|
-
import { generateGlobalId, generateUuidV7 } from '@lucern/contracts/ids';
|
|
10
|
+
import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertUuidShapedEdgeEndpoint } from '@lucern/contracts/ids';
|
|
11
|
+
import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
|
|
11
12
|
import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
|
|
12
13
|
|
|
13
14
|
// src/epistemicBeliefs.helpers.ts
|
|
@@ -285,6 +286,9 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
|
|
|
285
286
|
type: mapProjectType(topic, metadata),
|
|
286
287
|
description: readNonEmptyString(topic.description),
|
|
287
288
|
ownerId: readNonEmptyString(metadata.ownerId) || readNonEmptyString(topic.createdBy) || "system",
|
|
289
|
+
// FR.7 creator-grant: surface the principal-shaped owner field (column-first,
|
|
290
|
+
// metadata fallback for legacy rows that recorded it in metadata).
|
|
291
|
+
ownerPrincipalId: readNonEmptyString(topic.ownerPrincipalId) || readNonEmptyString(metadata.ownerPrincipalId),
|
|
288
292
|
sharedWith: readStringArray(metadata.sharedWith),
|
|
289
293
|
visibility,
|
|
290
294
|
tenantId: readNonEmptyString(topic.tenantId) || readNonEmptyString(metadata.tenantId),
|
|
@@ -479,6 +483,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
|
|
|
479
483
|
};
|
|
480
484
|
}
|
|
481
485
|
var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
|
|
486
|
+
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
487
|
+
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
let node = null;
|
|
491
|
+
try {
|
|
492
|
+
const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
|
|
493
|
+
if (byGlobalId && byGlobalId.nodeType === "topic") {
|
|
494
|
+
node = byGlobalId;
|
|
495
|
+
}
|
|
496
|
+
} catch (error) {
|
|
497
|
+
debugGraphPrimitiveFallback(
|
|
498
|
+
"[topicScope] topic-node scope lookup by globalId failed",
|
|
499
|
+
{ error, ref }
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
if (!node) {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
|
|
506
|
+
if (!scopeKey) {
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
topicId: scopeKey,
|
|
511
|
+
projectId: asMappedProjectId(node),
|
|
512
|
+
source: "topic_node"
|
|
513
|
+
};
|
|
514
|
+
}
|
|
482
515
|
function asMappedProjectId(topic) {
|
|
483
516
|
if (!topic) {
|
|
484
517
|
return;
|
|
@@ -619,6 +652,13 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
619
652
|
) ?? null;
|
|
620
653
|
}
|
|
621
654
|
if (!topic) {
|
|
655
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
656
|
+
ctx,
|
|
657
|
+
String(args.topicId)
|
|
658
|
+
);
|
|
659
|
+
if (nodeScope) {
|
|
660
|
+
return nodeScope;
|
|
661
|
+
}
|
|
622
662
|
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
623
663
|
}
|
|
624
664
|
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
@@ -689,6 +729,16 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
689
729
|
source: "project_mapped_topic"
|
|
690
730
|
};
|
|
691
731
|
}
|
|
732
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
733
|
+
ctx,
|
|
734
|
+
String(args.projectId)
|
|
735
|
+
);
|
|
736
|
+
if (nodeScope) {
|
|
737
|
+
return {
|
|
738
|
+
...nodeScope,
|
|
739
|
+
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
740
|
+
};
|
|
741
|
+
}
|
|
692
742
|
throw new Error(
|
|
693
743
|
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
694
744
|
);
|
|
@@ -860,7 +910,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
|
|
|
860
910
|
tupleContradiction: normalizeTupleContradictionPolicy()
|
|
861
911
|
};
|
|
862
912
|
function throwStructuredMutationError(args) {
|
|
863
|
-
const
|
|
913
|
+
const data = {
|
|
914
|
+
structuredMutationError: true,
|
|
915
|
+
message: args.message,
|
|
916
|
+
status: args.status,
|
|
917
|
+
code: args.code,
|
|
918
|
+
invariantCode: args.invariantCode,
|
|
919
|
+
suggestion: args.suggestion,
|
|
920
|
+
details: args.details
|
|
921
|
+
};
|
|
922
|
+
const error = new ConvexError(
|
|
923
|
+
data
|
|
924
|
+
);
|
|
864
925
|
error.status = args.status;
|
|
865
926
|
error.code = args.code;
|
|
866
927
|
error.invariantCode = args.invariantCode;
|
|
@@ -1209,12 +1270,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
|
|
|
1209
1270
|
);
|
|
1210
1271
|
if (!hasAccess) {
|
|
1211
1272
|
throwStructuredMutationError({
|
|
1212
|
-
message:
|
|
1273
|
+
message: `Project write access denied for topic ${projectId}.`,
|
|
1213
1274
|
status: 403,
|
|
1214
|
-
code: "
|
|
1275
|
+
code: "PROJECT_ACCESS_DENIED",
|
|
1215
1276
|
invariantCode: "policy.scope_required",
|
|
1216
|
-
suggestion: "
|
|
1217
|
-
details: { projectId, userId }
|
|
1277
|
+
suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
|
|
1278
|
+
details: { topicId: projectId, principalId: userId }
|
|
1218
1279
|
});
|
|
1219
1280
|
}
|
|
1220
1281
|
}
|
|
@@ -1870,14 +1931,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
|
|
|
1870
1931
|
beliefConfidenceId
|
|
1871
1932
|
};
|
|
1872
1933
|
}
|
|
1873
|
-
function
|
|
1934
|
+
function propagationPressureLabel(edgeType, weight) {
|
|
1874
1935
|
if (edgeType === "contradicts" || edgeType === "refutes") {
|
|
1875
|
-
return "
|
|
1936
|
+
return "contradictory";
|
|
1876
1937
|
}
|
|
1877
1938
|
if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
|
|
1878
|
-
return "
|
|
1939
|
+
return "contradictory";
|
|
1879
1940
|
}
|
|
1880
|
-
return "
|
|
1941
|
+
return "supportive";
|
|
1881
1942
|
}
|
|
1882
1943
|
var propagateConfidenceChange = internalMutation({
|
|
1883
1944
|
args: {
|
|
@@ -1914,14 +1975,15 @@ var propagateConfidenceChange = internalMutation({
|
|
|
1914
1975
|
getNode: async (nodeId) => await ctx.db.get(nodeId)
|
|
1915
1976
|
});
|
|
1916
1977
|
for (const dispatch of dispatches) {
|
|
1978
|
+
const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
|
|
1917
1979
|
await applyBeliefConfidenceChange(ctx, {
|
|
1918
1980
|
nodeId: dispatch.targetNodeId,
|
|
1919
1981
|
belief: dispatch.opinion.b,
|
|
1920
1982
|
disbelief: dispatch.opinion.d,
|
|
1921
1983
|
uncertainty: dispatch.opinion.u,
|
|
1922
1984
|
baseRate: dispatch.opinion.a,
|
|
1923
|
-
trigger:
|
|
1924
|
-
rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
|
|
1985
|
+
trigger: "propagation",
|
|
1986
|
+
rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
|
|
1925
1987
|
authenticatedUserId: args.userId,
|
|
1926
1988
|
slOperator: dispatch.operator
|
|
1927
1989
|
});
|
|
@@ -2033,6 +2095,52 @@ async function resolveForkTriggerEvidence(ctx, args) {
|
|
|
2033
2095
|
}
|
|
2034
2096
|
return { evidenceNodeId: args.triggeringEvidenceId, relation };
|
|
2035
2097
|
}
|
|
2098
|
+
async function insertEpistemicNode(ctx, doc) {
|
|
2099
|
+
assertUuidV7Identity("epistemicNodes", doc.globalId);
|
|
2100
|
+
return ctx.db.insert("epistemicNodes", doc);
|
|
2101
|
+
}
|
|
2102
|
+
async function assertExistingNodeEndpoint(ctx, endpointRole, endpoint) {
|
|
2103
|
+
assertUuidShapedEdgeEndpoint(endpointRole, endpoint);
|
|
2104
|
+
const node = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", endpoint)).first();
|
|
2105
|
+
if (!node) {
|
|
2106
|
+
throw new Error(
|
|
2107
|
+
`edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`
|
|
2108
|
+
);
|
|
2109
|
+
}
|
|
2110
|
+
}
|
|
2111
|
+
async function insertEpistemicEdge(ctx, doc) {
|
|
2112
|
+
assertUuidV7Identity("epistemicEdges", doc.globalId);
|
|
2113
|
+
assertStorageEdgeVocabulary(doc.edgeType);
|
|
2114
|
+
if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
|
|
2115
|
+
throw new Error(
|
|
2116
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
|
|
2117
|
+
);
|
|
2118
|
+
}
|
|
2119
|
+
if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
|
|
2120
|
+
throw new Error(
|
|
2121
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
|
|
2122
|
+
);
|
|
2123
|
+
}
|
|
2124
|
+
await assertExistingNodeEndpoint(ctx, "fromNodeId", doc.fromNodeId);
|
|
2125
|
+
await assertExistingNodeEndpoint(ctx, "toNodeId", doc.toNodeId);
|
|
2126
|
+
if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
|
|
2127
|
+
assertEdgePolicyAllowed(
|
|
2128
|
+
edgePolicyManifest,
|
|
2129
|
+
doc.edgeType,
|
|
2130
|
+
{
|
|
2131
|
+
kind: "epistemic_node",
|
|
2132
|
+
nodeId: doc.fromNodeId,
|
|
2133
|
+
nodeType: doc.fromNodeType
|
|
2134
|
+
},
|
|
2135
|
+
{
|
|
2136
|
+
kind: "epistemic_node",
|
|
2137
|
+
nodeId: doc.toNodeId,
|
|
2138
|
+
nodeType: doc.toNodeType
|
|
2139
|
+
}
|
|
2140
|
+
);
|
|
2141
|
+
}
|
|
2142
|
+
return ctx.db.insert("epistemicEdges", doc);
|
|
2143
|
+
}
|
|
2036
2144
|
|
|
2037
2145
|
// src/epistemicBeliefs.topicAnchor.ts
|
|
2038
2146
|
function cleanString(value) {
|
|
@@ -2084,18 +2192,15 @@ async function createRequiredBeliefTopicEdge(ctx, args) {
|
|
|
2084
2192
|
const now = Date.now();
|
|
2085
2193
|
const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
|
|
2086
2194
|
"by_from_to",
|
|
2087
|
-
(q) => q.eq("fromNodeId",
|
|
2088
|
-
"toNodeId",
|
|
2089
|
-
String(args.topicNode._id)
|
|
2090
|
-
)
|
|
2195
|
+
(q) => q.eq("fromNodeId", args.beliefGlobalId).eq("toNodeId", topicGlobalId)
|
|
2091
2196
|
).collect();
|
|
2092
2197
|
const existing = existingEdges.find((edge) => edge.edgeType === "belongs_to");
|
|
2093
2198
|
const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();
|
|
2094
2199
|
if (!existing) {
|
|
2095
|
-
await ctx
|
|
2200
|
+
await insertEpistemicEdge(ctx, {
|
|
2096
2201
|
globalId: edgeGlobalId,
|
|
2097
|
-
fromNodeId:
|
|
2098
|
-
toNodeId:
|
|
2202
|
+
fromNodeId: args.beliefGlobalId,
|
|
2203
|
+
toNodeId: topicGlobalId,
|
|
2099
2204
|
sourceGlobalId: args.beliefGlobalId,
|
|
2100
2205
|
targetGlobalId: topicGlobalId,
|
|
2101
2206
|
edgeType: "belongs_to",
|
|
@@ -2274,7 +2379,7 @@ var create = mutation({
|
|
|
2274
2379
|
const pillar = normalizePillar(args.pillar);
|
|
2275
2380
|
const additionalMeta = args.metadata || {};
|
|
2276
2381
|
const beliefGlobalId = generateGlobalId();
|
|
2277
|
-
const nodeId = await ctx
|
|
2382
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
2278
2383
|
globalId: beliefGlobalId,
|
|
2279
2384
|
nodeType: "belief",
|
|
2280
2385
|
epistemicLayer: "L3",
|
|
@@ -2332,7 +2437,6 @@ var create = mutation({
|
|
|
2332
2437
|
})
|
|
2333
2438
|
);
|
|
2334
2439
|
await createRequiredBeliefTopicEdge(ctx, {
|
|
2335
|
-
beliefNodeId: nodeId,
|
|
2336
2440
|
beliefGlobalId,
|
|
2337
2441
|
topicNode,
|
|
2338
2442
|
createdBy: authenticatedUserId
|
|
@@ -2747,7 +2851,7 @@ var forkBelief = mutation({
|
|
|
2747
2851
|
});
|
|
2748
2852
|
}
|
|
2749
2853
|
const newBeliefGlobalId = generateGlobalId();
|
|
2750
|
-
const newNodeId = await ctx
|
|
2854
|
+
const newNodeId = await insertEpistemicNode(ctx, {
|
|
2751
2855
|
globalId: newBeliefGlobalId,
|
|
2752
2856
|
nodeType: "belief",
|
|
2753
2857
|
epistemicLayer: "L3",
|
|
@@ -3531,10 +3635,11 @@ var linkEvidence = mutation({
|
|
|
3531
3635
|
const edgeType = "informs";
|
|
3532
3636
|
const logicalRole = evidenceNodeId ? await computeLogicalRole(ctx, evidenceNodeId, args.beliefNodeId) : "contributory";
|
|
3533
3637
|
const edgeGlobalId = generateGlobalId();
|
|
3534
|
-
await ctx
|
|
3638
|
+
await insertEpistemicEdge(ctx, {
|
|
3535
3639
|
globalId: edgeGlobalId,
|
|
3536
|
-
|
|
3537
|
-
|
|
3640
|
+
// C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.
|
|
3641
|
+
fromNodeId: evidenceGlobalId,
|
|
3642
|
+
toNodeId: belief.globalId,
|
|
3538
3643
|
sourceGlobalId: evidenceGlobalId,
|
|
3539
3644
|
targetGlobalId: belief.globalId,
|
|
3540
3645
|
edgeType,
|
|
@@ -4330,7 +4435,7 @@ var internalCreate = internalMutation({
|
|
|
4330
4435
|
opinion_u: 1,
|
|
4331
4436
|
opinion_a: baseRate
|
|
4332
4437
|
};
|
|
4333
|
-
const nodeId = await ctx
|
|
4438
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
4334
4439
|
globalId,
|
|
4335
4440
|
topicId: scope.topicId,
|
|
4336
4441
|
projectId: scope.projectId,
|
|
@@ -4386,7 +4491,6 @@ var internalCreate = internalMutation({
|
|
|
4386
4491
|
})
|
|
4387
4492
|
);
|
|
4388
4493
|
await createRequiredBeliefTopicEdge(ctx, {
|
|
4389
|
-
beliefNodeId: nodeId,
|
|
4390
4494
|
beliefGlobalId: globalId,
|
|
4391
4495
|
topicNode,
|
|
4392
4496
|
createdBy: args.userId
|