@remnic/belief-ledger 9.3.596

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts","../src/reflection.ts","../src/remnic-store.ts","../src/retrieval.ts","../src/ledger.ts","../src/llm.ts"],"sourcesContent":["import type { MemoryFile, MemoryFrontmatter } from \"@remnic/core\";\nimport type {\n LedgerClaim,\n LedgerClaimDraft,\n LedgerClaimKind,\n LedgerClaimScope,\n LedgerClaimStatus,\n LedgerPredictionGrade,\n LedgerPredictionVerdict,\n LedgerResolution,\n LedgerStance,\n LedgerJudgeClassification,\n LedgerJudgeResult,\n LedgerChallenge,\n} from \"./types.js\";\n\nexport const LEDGER_TAG = \"belief-ledger\";\nexport const LEDGER_SCHEMA_VERSION = \"1\";\n\nconst KIND_VALUES = new Set<LedgerClaimKind>([\"claim\", \"prediction\", \"opinion\"]);\nconst STANCE_VALUES = new Set<LedgerStance>([\"for\", \"against\", \"uncertain\", \"neutral\"]);\nconst STATUS_VALUES = new Set<LedgerClaimStatus>([\"active\", \"superseded\", \"resolved\", \"snoozed\", \"ignored\"]);\nconst JUDGE_VALUES = new Set<LedgerJudgeClassification>([\"contradiction\", \"evolution\", \"refinement\", \"unrelated\"]);\nconst VERDICT_VALUES = new Set<LedgerPredictionVerdict>([\"true\", \"false\", \"mixed\", \"unknown\"]);\nconst HIDDEN_REMNIC_STATUSES = new Set<NonNullable<MemoryFrontmatter[\"status\"]>>([\n \"forgotten\",\n \"pending_review\",\n \"quarantined\",\n \"rejected\",\n]);\n\ntype StringRecord = Record<string, string>;\n\nexport function normalizeClaimDraft(\n draft: LedgerClaimDraft,\n options: { now: string; sourceText?: string }\n): Omit<LedgerClaim, \"id\" | \"memoryId\" | \"sourceMemory\"> {\n const now = normalizeIsoTimestamp(\"now\", options.now);\n const statement = cleanRequiredString(\"statement\", draft.statement, 5_000);\n const deadline = draft.deadline === undefined ? undefined : normalizeIsoTimestamp(\"deadline\", draft.deadline);\n const kind = normalizeKind(draft.kind ?? (deadline ? \"prediction\" : \"claim\"));\n const stance = normalizeStance(draft.stance);\n const confidence = normalizeUnitInterval(\"confidence\", draft.confidence);\n const scope = normalizeScope(draft.scope);\n\n return {\n statement,\n kind,\n stance,\n confidence,\n scope,\n deadline,\n evidenceLinks: normalizeStringList(\"evidenceLinks\", draft.evidenceLinks ?? [], 100, 2_048),\n status: \"active\",\n createdAt: now,\n updatedAt: now,\n parentIds: [],\n ...(options.sourceText ? { sourceText: options.sourceText } : {}),\n };\n}\n\nexport function normalizeJudgeResult(raw: unknown, priorClaimId: string): LedgerJudgeResult {\n if (!isRecord(raw)) {\n throw new Error(\"judge result must be an object\");\n }\n const classification = normalizeJudgeClassification(raw.classification);\n return {\n priorClaimId,\n classification,\n confidence: normalizeUnitInterval(\"judge confidence\", raw.confidence ?? 0.5),\n rationale: cleanRequiredString(\"judge rationale\", raw.rationale ?? \"\", 2_000),\n };\n}\n\nexport function normalizeChallenge(raw: unknown, priorClaimIds: string[]): LedgerChallenge {\n if (!isRecord(raw)) {\n throw new Error(\"challenge must be an object\");\n }\n const question = cleanRequiredString(\"challenge question\", raw.question, 2_000);\n const parsedPriorIds = normalizeStringList(\n \"challenge priorClaimIds\",\n Array.isArray(raw.priorClaimIds) ? raw.priorClaimIds : priorClaimIds,\n 50,\n 256\n );\n const allowedPriorIds = new Set(priorClaimIds);\n const safePriorIds = parsedPriorIds.filter((id) => allowedPriorIds.has(id));\n const suggestedActions = Array.isArray(raw.suggestedActions)\n ? raw.suggestedActions.filter(\n (value): value is LedgerChallenge[\"suggestedActions\"][number] =>\n value === \"supersede\" || value === \"split\" || value === \"resolve\" || value === \"ignore\"\n )\n : [];\n return {\n question,\n priorClaimIds: safePriorIds.length > 0 ? safePriorIds : priorClaimIds,\n suggestedActions: suggestedActions.length > 0 ? [...new Set(suggestedActions)] : [\"supersede\", \"split\", \"ignore\"],\n };\n}\n\nexport function normalizePredictionGrade(raw: unknown): LedgerPredictionGrade {\n if (!isRecord(raw)) {\n throw new Error(\"prediction grade must be an object\");\n }\n return {\n verdict: normalizePredictionVerdict(raw.verdict),\n actualConfidence: normalizeUnitInterval(\"actualConfidence\", raw.actualConfidence),\n rationale: cleanRequiredString(\"grade rationale\", raw.rationale ?? \"\", 2_000),\n ...(typeof raw.source === \"string\" && raw.source.trim() ? { source: raw.source.trim().slice(0, 2_048) } : {}),\n };\n}\n\nexport function createResolution(input: {\n verdict: LedgerPredictionVerdict;\n actualConfidence: number;\n resolvedAt: string;\n source?: string;\n notes?: string;\n predictedConfidence: number;\n}): LedgerResolution {\n const actualConfidence = normalizeUnitInterval(\"actualConfidence\", input.actualConfidence);\n const predictedConfidence = normalizeUnitInterval(\"predictedConfidence\", input.predictedConfidence);\n const resolvedAt = normalizeIsoTimestamp(\"resolvedAt\", input.resolvedAt);\n return {\n verdict: normalizePredictionVerdict(input.verdict),\n actualConfidence,\n resolvedAt,\n ...(input.source ? { source: cleanRequiredString(\"source\", input.source, 2_048) } : {}),\n ...(input.notes ? { notes: cleanRequiredString(\"notes\", input.notes, 5_000) } : {}),\n brierScore: computeBrierScore(predictedConfidence, actualConfidence),\n };\n}\n\nexport function computeBrierScore(predictedConfidence: number, actualConfidence: number): number {\n const predicted = normalizeUnitInterval(\"predictedConfidence\", predictedConfidence);\n const actual = normalizeUnitInterval(\"actualConfidence\", actualConfidence);\n return roundMetric((predicted - actual) ** 2);\n}\n\nexport function roundMetric(value: number): number {\n if (!Number.isFinite(value)) {\n throw new Error(`metric must be finite, got ${String(value)}`);\n }\n return Math.round(value * 1_000_000) / 1_000_000;\n}\n\nexport function claimToStructuredAttributes(claim: LedgerClaim): StringRecord {\n const attrs: StringRecord = {\n \"ledger.schemaVersion\": LEDGER_SCHEMA_VERSION,\n \"ledger.kind\": claim.kind,\n \"ledger.stance\": claim.stance,\n \"ledger.confidence\": String(claim.confidence),\n \"ledger.entities\": JSON.stringify(claim.scope.entities),\n \"ledger.status\": claim.status,\n \"ledger.createdAt\": claim.createdAt,\n \"ledger.updatedAt\": claim.updatedAt,\n \"ledger.parentIds\": JSON.stringify(claim.parentIds),\n };\n if (claim.scope.domain) attrs[\"ledger.domain\"] = claim.scope.domain;\n if (claim.scope.timeWindow?.start) attrs[\"ledger.timeWindowStart\"] = claim.scope.timeWindow.start;\n if (claim.scope.timeWindow?.end) attrs[\"ledger.timeWindowEnd\"] = claim.scope.timeWindow.end;\n if (claim.deadline) attrs[\"ledger.deadline\"] = claim.deadline;\n if (claim.evidenceLinks.length > 0) attrs[\"ledger.evidenceLinks\"] = JSON.stringify(claim.evidenceLinks);\n if (claim.supersedes) attrs[\"ledger.supersedes\"] = claim.supersedes;\n if (claim.supersededBy) attrs[\"ledger.supersededBy\"] = claim.supersededBy;\n if (claim.snoozedUntil) attrs[\"ledger.snoozedUntil\"] = claim.snoozedUntil;\n if (claim.ignoredAt) attrs[\"ledger.ignoredAt\"] = claim.ignoredAt;\n if (claim.ignoredReason) attrs[\"ledger.ignoredReason\"] = claim.ignoredReason;\n if (claim.sourceText) attrs[\"ledger.sourceText\"] = claim.sourceText.slice(0, 5_000);\n if (claim.resolution) {\n attrs[\"ledger.verdict\"] = claim.resolution.verdict;\n attrs[\"ledger.actualConfidence\"] = String(claim.resolution.actualConfidence);\n attrs[\"ledger.resolvedAt\"] = claim.resolution.resolvedAt;\n if (claim.resolution.source) attrs[\"ledger.resolutionSource\"] = claim.resolution.source;\n if (claim.resolution.notes) attrs[\"ledger.resolutionNotes\"] = claim.resolution.notes;\n if (claim.resolution.brierScore !== undefined) attrs[\"ledger.brierScore\"] = String(claim.resolution.brierScore);\n }\n return attrs;\n}\n\nexport function claimTags(claim: LedgerClaim): string[] {\n const tags = [LEDGER_TAG, `${LEDGER_TAG}:${claim.kind}`, `${LEDGER_TAG}:status:${claim.status}`];\n if (claim.scope.domain) {\n tags.push(`${LEDGER_TAG}:domain:${slugTagValue(claim.scope.domain)}`);\n }\n if (claim.deadline) tags.push(`${LEDGER_TAG}:deadline`);\n return [...new Set(tags)];\n}\n\nexport function serializeClaimBody(\n claim: Pick<\n LedgerClaim,\n \"statement\" | \"kind\" | \"stance\" | \"confidence\" | \"scope\" | \"deadline\" | \"evidenceLinks\" | \"status\" | \"resolution\"\n >\n): string {\n const lines = [\n \"# Belief Ledger Claim\",\n \"\",\n claim.statement,\n \"\",\n `Kind: ${claim.kind}`,\n `Stance: ${claim.stance}`,\n `Confidence: ${claim.confidence}`,\n `Status: ${claim.status}`,\n ];\n if (claim.scope.domain) lines.push(`Domain: ${claim.scope.domain}`);\n if (claim.scope.entities.length > 0) lines.push(`Entities: ${claim.scope.entities.join(\", \")}`);\n if (claim.deadline) lines.push(`Deadline: ${claim.deadline}`);\n if (claim.resolution) {\n lines.push(`Verdict: ${claim.resolution.verdict}`);\n lines.push(`Actual confidence: ${claim.resolution.actualConfidence}`);\n if (claim.resolution.brierScore !== undefined) {\n lines.push(`Brier score: ${claim.resolution.brierScore}`);\n }\n }\n if (claim.evidenceLinks.length > 0) {\n lines.push(\"\", \"Evidence:\");\n for (const link of claim.evidenceLinks) {\n lines.push(`- ${link}`);\n }\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function claimFromMemory(memory: MemoryFile): LedgerClaim | null {\n const attrs = normalizeStructuredAttributes(memory.frontmatter.structuredAttributes);\n const tags = memory.frontmatter.tags ?? [];\n if (!tags.includes(LEDGER_TAG) && attrs[\"ledger.schemaVersion\"] !== LEDGER_SCHEMA_VERSION) {\n return null;\n }\n if (isHiddenRemnicStatus(memory.frontmatter.status)) {\n return null;\n }\n\n const storedStatus = normalizeStatus(attrs[\"ledger.status\"] ?? \"active\");\n if (memory.frontmatter.status === \"archived\" && storedStatus === \"active\") {\n return null;\n }\n\n const statement = extractStatement(memory.content);\n if (!statement) return null;\n\n const entities = parseStringArrayAttribute(\"ledger.entities\", attrs[\"ledger.entities\"]);\n const entityRef = memory.frontmatter.entityRef?.trim();\n if (entityRef && !entities.includes(entityRef)) {\n entities.unshift(entityRef);\n }\n\n const resolution = parseResolution(attrs);\n const status = memory.frontmatter.status === \"superseded\" ? \"superseded\" : storedStatus;\n const claim: LedgerClaim = {\n id: memory.frontmatter.id,\n memoryId: memory.frontmatter.id,\n statement,\n kind: normalizeKind(attrs[\"ledger.kind\"] ?? \"claim\"),\n stance: normalizeStance(attrs[\"ledger.stance\"] ?? \"uncertain\"),\n confidence: normalizeUnitInterval(\"confidence\", attrs[\"ledger.confidence\"] ?? memory.frontmatter.confidence),\n scope: {\n entities,\n ...(attrs[\"ledger.domain\"] ? { domain: attrs[\"ledger.domain\"] } : {}),\n ...parseTimeWindow(attrs),\n },\n ...(attrs[\"ledger.deadline\"] ? { deadline: normalizeIsoTimestamp(\"deadline\", attrs[\"ledger.deadline\"]) } : {}),\n evidenceLinks: parseStringArrayAttribute(\"ledger.evidenceLinks\", attrs[\"ledger.evidenceLinks\"]),\n status,\n createdAt: normalizeIsoTimestamp(\n \"createdAt\",\n attrs[\"ledger.createdAt\"] ?? memory.frontmatter.valid_at ?? memory.frontmatter.created\n ),\n updatedAt: normalizeIsoTimestamp(\"updatedAt\", attrs[\"ledger.updatedAt\"] ?? memory.frontmatter.updated),\n ...(memory.frontmatter.supersedes || attrs[\"ledger.supersedes\"]\n ? { supersedes: attrs[\"ledger.supersedes\"] ?? memory.frontmatter.supersedes }\n : {}),\n ...(memory.frontmatter.supersededBy || attrs[\"ledger.supersededBy\"]\n ? { supersededBy: attrs[\"ledger.supersededBy\"] ?? memory.frontmatter.supersededBy }\n : {}),\n parentIds: parseStringArrayAttribute(\"ledger.parentIds\", attrs[\"ledger.parentIds\"]).concat(\n memory.frontmatter.lineage ?? []\n ),\n ...(attrs[\"ledger.snoozedUntil\"]\n ? { snoozedUntil: normalizeIsoTimestamp(\"snoozedUntil\", attrs[\"ledger.snoozedUntil\"]) }\n : {}),\n ...(attrs[\"ledger.ignoredAt\"] ? { ignoredAt: normalizeIsoTimestamp(\"ignoredAt\", attrs[\"ledger.ignoredAt\"]) } : {}),\n ...(attrs[\"ledger.ignoredReason\"] ? { ignoredReason: attrs[\"ledger.ignoredReason\"] } : {}),\n ...(resolution ? { resolution } : {}),\n ...(attrs[\"ledger.sourceText\"] ? { sourceText: attrs[\"ledger.sourceText\"] } : {}),\n sourceMemory: memory,\n };\n\n claim.parentIds = [...new Set(claim.parentIds.filter((value) => value !== claim.id))];\n return claim;\n}\n\nfunction isHiddenRemnicStatus(status: MemoryFrontmatter[\"status\"] | undefined): boolean {\n return status !== undefined && HIDDEN_REMNIC_STATUSES.has(status);\n}\n\nexport function mergeClaimPatch(claim: LedgerClaim, patch: Partial<LedgerClaim>, now: string): LedgerClaim {\n const updated: LedgerClaim = {\n ...claim,\n ...patch,\n scope: patch.scope ? normalizeScope(patch.scope) : claim.scope,\n evidenceLinks: patch.evidenceLinks\n ? normalizeStringList(\"evidenceLinks\", patch.evidenceLinks, 100, 2_048)\n : claim.evidenceLinks,\n parentIds: patch.parentIds ? normalizeStringList(\"parentIds\", patch.parentIds, 100, 256) : claim.parentIds,\n createdAt: normalizeIsoTimestamp(\"createdAt\", patch.createdAt ?? claim.createdAt),\n updatedAt: normalizeIsoTimestamp(\"updatedAt\", patch.updatedAt ?? now),\n };\n updated.statement = cleanRequiredString(\"statement\", updated.statement, 5_000);\n updated.kind = normalizeKind(updated.kind);\n updated.stance = normalizeStance(updated.stance);\n updated.confidence = normalizeUnitInterval(\"confidence\", updated.confidence);\n updated.status = normalizeStatus(updated.status);\n if (updated.resolution) updated.resolution = normalizeResolutionPatch(updated.resolution, updated.confidence);\n if (updated.deadline) updated.deadline = normalizeIsoTimestamp(\"deadline\", updated.deadline);\n if (updated.snoozedUntil) updated.snoozedUntil = normalizeIsoTimestamp(\"snoozedUntil\", updated.snoozedUntil);\n if (updated.ignoredAt) updated.ignoredAt = normalizeIsoTimestamp(\"ignoredAt\", updated.ignoredAt);\n return updated;\n}\n\nfunction normalizeResolutionPatch(value: unknown, predictedConfidence: number): LedgerResolution {\n if (!isRecord(value)) {\n throw new Error(\"resolution must be an object\");\n }\n if (value.source !== undefined && typeof value.source !== \"string\") {\n throw new Error(\"resolution source must be a string\");\n }\n if (value.notes !== undefined && typeof value.notes !== \"string\") {\n throw new Error(\"resolution notes must be a string\");\n }\n return createResolution({\n verdict: value.verdict as LedgerPredictionVerdict,\n actualConfidence: value.actualConfidence as number,\n resolvedAt: value.resolvedAt as string,\n source: value.source,\n notes: value.notes,\n predictedConfidence,\n });\n}\n\nexport function memoryFrontmatterPatchForClaim(claim: LedgerClaim): Partial<MemoryFrontmatter> {\n return {\n updated: claim.updatedAt,\n confidence: claim.confidence,\n tags: claimTags(claim),\n entityRef: claim.scope.entities[0],\n supersedes: claim.supersedes,\n lineage: claim.parentIds.length > 0 ? claim.parentIds : undefined,\n status: remnicMemoryStatusForClaim(claim),\n supersededBy: claim.supersededBy,\n supersededAt: claim.status === \"superseded\" ? claim.updatedAt : undefined,\n structuredAttributes: claimToStructuredAttributes(claim),\n };\n}\n\nexport function remnicMemoryStatusForClaim(\n claim: Pick<LedgerClaim, \"status\">\n): NonNullable<MemoryFrontmatter[\"status\"]> {\n switch (claim.status) {\n case \"active\":\n return \"active\";\n case \"superseded\":\n return \"superseded\";\n case \"ignored\":\n case \"resolved\":\n case \"snoozed\":\n return \"archived\";\n }\n}\n\nexport function normalizeIsoTimestamp(field: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${field} must be a non-empty ISO timestamp string`);\n }\n const trimmed = value.trim();\n validateIsoTimestampComponents(field, trimmed);\n const time = Date.parse(trimmed);\n if (!Number.isFinite(time)) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(value)}`);\n }\n const date = new Date(time);\n if (!Number.isFinite(date.getTime())) {\n throw new Error(`${field} must be within JavaScript Date bounds`);\n }\n return date.toISOString();\n}\n\nfunction validateIsoTimestampComponents(field: string, value: string): void {\n if (value.length < 10 || value[4] !== \"-\" || value[7] !== \"-\") {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(value)}`);\n }\n const year = readFixedDigits(value, 0, 4);\n const month = readFixedDigits(value, 5, 2);\n const day = readFixedDigits(value, 8, 2);\n if (year === undefined || month === undefined || day === undefined) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(value)}`);\n }\n\n if (value.length === 10) {\n assertValidCalendarParts(field, value, year, month, day, 0, 0, 0, 0);\n return;\n }\n\n const separator = value[10];\n if (separator !== \"T\" && separator !== \"t\" && separator !== \" \") {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(value)}`);\n }\n\n const timeText = stripAndValidateTimeZone(field, value, value.slice(11));\n const timeParts = parseIsoTimeParts(field, value, timeText);\n assertValidCalendarParts(\n field,\n value,\n year,\n month,\n day,\n timeParts.hour,\n timeParts.minute,\n timeParts.second,\n timeParts.millisecond\n );\n}\n\nfunction stripAndValidateTimeZone(field: string, original: string, rawTime: string): string {\n if (!rawTime) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n const lastChar = rawTime[rawTime.length - 1];\n if (lastChar === \"Z\" || lastChar === \"z\") {\n return rawTime.slice(0, -1);\n }\n\n const offsetStart = rawTime.length - 6;\n const sign = offsetStart > 0 ? rawTime[offsetStart] : undefined;\n if ((sign === \"+\" || sign === \"-\") && rawTime[offsetStart + 3] === \":\") {\n const offsetHour = readFixedDigits(rawTime, offsetStart + 1, 2);\n const offsetMinute = readFixedDigits(rawTime, offsetStart + 4, 2);\n if (offsetHour === undefined || offsetMinute === undefined || offsetHour > 23 || offsetMinute > 59) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n return rawTime.slice(0, offsetStart);\n }\n\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n}\n\nfunction parseIsoTimeParts(\n field: string,\n original: string,\n value: string\n): { hour: number; minute: number; second: number; millisecond: number } {\n if (value.length < 5 || value[2] !== \":\") {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n const hour = readFixedDigits(value, 0, 2);\n const minute = readFixedDigits(value, 3, 2);\n if (hour === undefined || minute === undefined || hour > 23 || minute > 59) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n if (value.length === 5) {\n return { hour, minute, second: 0, millisecond: 0 };\n }\n if (value[5] !== \":\") {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n const second = readFixedDigits(value, 6, 2);\n if (second === undefined || second > 59) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n if (value.length === 8) {\n return { hour, minute, second, millisecond: 0 };\n }\n if (value[8] !== \".\") {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n const fraction = value.slice(9);\n if (fraction.length === 0 || fraction.length > 3 || !isAllDigits(fraction)) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n return {\n hour,\n minute,\n second,\n millisecond: Number(fraction.padEnd(3, \"0\")),\n };\n}\n\nfunction assertValidCalendarParts(\n field: string,\n original: string,\n year: number,\n month: number,\n day: number,\n hour: number,\n minute: number,\n second: number,\n millisecond: number\n): void {\n const time = Date.UTC(year, month - 1, day, hour, minute, second, millisecond);\n const date = new Date(time);\n if (\n !Number.isFinite(time) ||\n date.getUTCFullYear() !== year ||\n date.getUTCMonth() !== month - 1 ||\n date.getUTCDate() !== day ||\n date.getUTCHours() !== hour ||\n date.getUTCMinutes() !== minute ||\n date.getUTCSeconds() !== second ||\n date.getUTCMilliseconds() !== millisecond\n ) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(original)}`);\n }\n}\n\nfunction readFixedDigits(value: string, start: number, length: number): number | undefined {\n const end = start + length;\n if (end > value.length) return undefined;\n const slice = value.slice(start, end);\n return isAllDigits(slice) ? Number(slice) : undefined;\n}\n\nfunction isAllDigits(value: string): boolean {\n if (!value) return false;\n for (const char of value) {\n const code = char.charCodeAt(0);\n if (code < 48 || code > 57) return false;\n }\n return true;\n}\n\nexport function normalizeUnitInterval(field: string, value: unknown): number {\n const num =\n typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() !== \"\" ? Number(value) : NaN;\n if (!Number.isFinite(num)) {\n throw new Error(`${field} must be a finite number in [0, 1], got ${String(value)}`);\n }\n if (num < 0 || num > 1) {\n throw new Error(`${field} must be in [0, 1], got ${num}`);\n }\n return num;\n}\n\nfunction normalizeScope(value: Partial<LedgerClaimScope> | undefined): LedgerClaimScope {\n const scope = value ?? {};\n const entities = normalizeStringList(\"entities\", scope.entities ?? [], 50, 256);\n const domain =\n typeof scope.domain === \"string\" && scope.domain.trim().length > 0 ? scope.domain.trim().slice(0, 256) : undefined;\n const timeWindow = scope.timeWindow ? normalizeTimeWindow(scope.timeWindow) : undefined;\n return {\n entities,\n ...(domain ? { domain } : {}),\n ...(timeWindow ? { timeWindow } : {}),\n };\n}\n\nfunction normalizeTimeWindow(value: { start?: unknown; end?: unknown }): { start?: string; end?: string } | undefined {\n const start = value.start === undefined ? undefined : normalizeIsoTimestamp(\"timeWindow.start\", value.start);\n const end = value.end === undefined ? undefined : normalizeIsoTimestamp(\"timeWindow.end\", value.end);\n if (start && end && Date.parse(start) >= Date.parse(end)) {\n throw new Error(\"timeWindow.start must be before timeWindow.end\");\n }\n return start || end ? { ...(start ? { start } : {}), ...(end ? { end } : {}) } : undefined;\n}\n\nfunction parseTimeWindow(attrs: StringRecord): { timeWindow?: { start?: string; end?: string } } {\n const start = attrs[\"ledger.timeWindowStart\"];\n const end = attrs[\"ledger.timeWindowEnd\"];\n const timeWindow = normalizeTimeWindow({ start, end });\n return timeWindow ? { timeWindow } : {};\n}\n\nfunction normalizeKind(value: unknown): LedgerClaimKind {\n if (typeof value !== \"string\" || !KIND_VALUES.has(value as LedgerClaimKind)) {\n throw new Error(`kind must be one of ${[...KIND_VALUES].join(\", \")}`);\n }\n return value as LedgerClaimKind;\n}\n\nfunction normalizeStance(value: unknown): LedgerStance {\n if (typeof value !== \"string\" || !STANCE_VALUES.has(value as LedgerStance)) {\n throw new Error(`stance must be one of ${[...STANCE_VALUES].join(\", \")}`);\n }\n return value as LedgerStance;\n}\n\nfunction normalizeStatus(value: unknown): LedgerClaimStatus {\n if (typeof value !== \"string\" || !STATUS_VALUES.has(value as LedgerClaimStatus)) {\n throw new Error(`status must be one of ${[...STATUS_VALUES].join(\", \")}`);\n }\n return value as LedgerClaimStatus;\n}\n\nfunction normalizeJudgeClassification(value: unknown): LedgerJudgeClassification {\n if (typeof value !== \"string\" || !JUDGE_VALUES.has(value as LedgerJudgeClassification)) {\n throw new Error(`classification must be one of ${[...JUDGE_VALUES].join(\", \")}`);\n }\n return value as LedgerJudgeClassification;\n}\n\nfunction normalizePredictionVerdict(value: unknown): LedgerPredictionVerdict {\n if (typeof value !== \"string\" || !VERDICT_VALUES.has(value as LedgerPredictionVerdict)) {\n throw new Error(`verdict must be one of ${[...VERDICT_VALUES].join(\", \")}`);\n }\n return value as LedgerPredictionVerdict;\n}\n\nfunction parseResolution(attrs: StringRecord): LedgerResolution | undefined {\n if (!attrs[\"ledger.verdict\"]) return undefined;\n const actualConfidence = normalizeUnitInterval(\"actualConfidence\", attrs[\"ledger.actualConfidence\"]);\n const verdict = normalizePredictionVerdict(attrs[\"ledger.verdict\"]);\n const resolvedAt = normalizeIsoTimestamp(\"resolvedAt\", attrs[\"ledger.resolvedAt\"]);\n return {\n verdict,\n actualConfidence,\n resolvedAt,\n ...(attrs[\"ledger.resolutionSource\"] ? { source: attrs[\"ledger.resolutionSource\"] } : {}),\n ...(attrs[\"ledger.resolutionNotes\"] ? { notes: attrs[\"ledger.resolutionNotes\"] } : {}),\n ...(attrs[\"ledger.brierScore\"] !== undefined\n ? { brierScore: roundMetric(Number(attrs[\"ledger.brierScore\"])) }\n : {}),\n };\n}\n\nfunction normalizeStructuredAttributes(value: unknown): StringRecord {\n if (!isRecord(value)) return {};\n const result: StringRecord = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") {\n result[key] = raw;\n } else if (typeof raw === \"number\" || typeof raw === \"boolean\") {\n result[key] = String(raw);\n }\n }\n return result;\n}\n\nfunction parseStringArrayAttribute(field: string, value: string | undefined): string[] {\n if (value === undefined || value.trim() === \"\") return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new Error(`${field} must be a JSON array`);\n }\n return normalizeStringList(field, parsed, 100, 2_048);\n}\n\nfunction normalizeStringList(field: string, value: unknown, maxItems: number, maxLength: number): string[] {\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array`);\n }\n const result: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n if (typeof item !== \"string\") {\n throw new Error(`${field} entries must be strings`);\n }\n const trimmed = item.trim();\n if (!trimmed) continue;\n const clipped = trimmed.slice(0, maxLength);\n if (seen.has(clipped)) continue;\n seen.add(clipped);\n result.push(clipped);\n if (result.length > maxItems) {\n throw new Error(`${field} must contain at most ${maxItems} entries`);\n }\n }\n return result;\n}\n\nfunction cleanRequiredString(field: string, value: unknown, maxLength: number): string {\n if (typeof value !== \"string\") {\n throw new Error(`${field} must be a string`);\n }\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`${field} must not be empty`);\n }\n if (trimmed.length > maxLength) {\n throw new Error(`${field} must be at most ${maxLength} characters`);\n }\n return trimmed;\n}\n\nfunction extractStatement(content: string): string {\n const normalized = content.replace(/\\r\\n/g, \"\\n\").trim();\n const lines = normalized.split(\"\\n\");\n const titleIndex = lines.findIndex((line) => line.trim() === \"# Belief Ledger Claim\");\n if (titleIndex >= 0) {\n const statementLines: string[] = [];\n let started = false;\n for (let i = titleIndex + 1; i < lines.length; i += 1) {\n const line = lines[i] ?? \"\";\n const trimmed = line.trim();\n if (!started && !trimmed) continue;\n if (isClaimMetadataLine(trimmed)) {\n break;\n }\n started = true;\n statementLines.push(line.trimEnd());\n }\n const statement = statementLines.join(\"\\n\").trim();\n if (statement) {\n return statement;\n }\n }\n const first = lines.find((line) => line.trim() && !line.trim().startsWith(\"#\"));\n return first?.trim() ?? \"\";\n}\n\nfunction isClaimMetadataLine(line: string): boolean {\n return CLAIM_METADATA_PREFIXES.some((prefix) => line.startsWith(prefix));\n}\n\nconst CLAIM_METADATA_PREFIXES = [\n \"Kind:\",\n \"Stance:\",\n \"Confidence:\",\n \"Status:\",\n \"Domain:\",\n \"Entities:\",\n \"Deadline:\",\n \"Verdict:\",\n \"Actual confidence:\",\n \"Brier score:\",\n];\n\nfunction slugTagValue(value: string): string {\n let slug = \"\";\n let pendingDash = false;\n for (const char of value.toLowerCase()) {\n const code = char.charCodeAt(0);\n const isAsciiLetter = code >= 97 && code <= 122;\n const isDigit = code >= 48 && code <= 57;\n if (isAsciiLetter || isDigit) {\n if (pendingDash && slug) slug += \"-\";\n slug += char;\n pendingDash = false;\n } else if (slug) {\n pendingDash = true;\n }\n }\n return slug || \"unknown\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { normalizeIsoTimestamp, roundMetric } from \"./schema.js\";\nimport type {\n LedgerCalibrationBin,\n LedgerClaim,\n LedgerDomainCalibration,\n LedgerDormantTopic,\n LedgerFlippedClaim,\n LedgerReflectionOptions,\n LedgerReflectionReport,\n} from \"./types.js\";\n\nconst DEFAULT_DORMANT_AFTER_DAYS = 60;\n\nexport function buildReflectionReport(\n claims: LedgerClaim[],\n options: LedgerReflectionOptions = {}\n): LedgerReflectionReport {\n const nowIso = normalizeIsoTimestamp(\"reflection.now\", options.now ?? new Date().toISOString());\n const now = Date.parse(nowIso);\n if (!Number.isFinite(now)) {\n throw new Error(`reflection now must be a valid ISO timestamp, got ${String(options.now)}`);\n }\n const resolvedPredictions = claims.filter(\n (claim) => claim.kind === \"prediction\" && claim.resolution?.brierScore !== undefined\n );\n const brierScore =\n resolvedPredictions.length > 0\n ? roundMetric(mean(resolvedPredictions.map((claim) => claim.resolution?.brierScore ?? 0)))\n : undefined;\n\n return {\n generatedAt: new Date(now).toISOString(),\n totalClaims: claims.length,\n activeClaims: claims.filter((claim) => claim.status === \"active\").length,\n resolvedPredictions: resolvedPredictions.length,\n ...(brierScore !== undefined ? { brierScore } : {}),\n calibrationBins: buildCalibrationBins(resolvedPredictions),\n domains: buildDomainCalibration(resolvedPredictions),\n flippedClaims: buildFlippedClaims(claims),\n dormantTopics: buildDormantTopics(claims, now, options.dormantAfterDays ?? DEFAULT_DORMANT_AFTER_DAYS),\n };\n}\n\nfunction buildCalibrationBins(claims: LedgerClaim[]): LedgerCalibrationBin[] {\n const bins = [\n { minConfidence: 0, maxConfidence: 0.2 },\n { minConfidence: 0.2, maxConfidence: 0.4 },\n { minConfidence: 0.4, maxConfidence: 0.6 },\n { minConfidence: 0.6, maxConfidence: 0.8 },\n { minConfidence: 0.8, maxConfidence: 1.000001 },\n ];\n return bins\n .map((bin) => {\n const members = claims.filter(\n (claim) => claim.confidence >= bin.minConfidence && claim.confidence < bin.maxConfidence\n );\n if (members.length === 0) return null;\n const predicted = mean(members.map((claim) => claim.confidence));\n const actual = mean(members.map((claim) => claim.resolution?.actualConfidence ?? 0.5));\n return {\n minConfidence: bin.minConfidence,\n maxConfidence: bin.maxConfidence > 1 ? 1 : bin.maxConfidence,\n count: members.length,\n meanPredictedConfidence: roundMetric(predicted),\n meanActualConfidence: roundMetric(actual),\n calibrationError: roundMetric(predicted - actual),\n };\n })\n .filter((bin): bin is LedgerCalibrationBin => bin !== null);\n}\n\nfunction buildDomainCalibration(claims: LedgerClaim[]): LedgerDomainCalibration[] {\n const grouped = new Map<string, LedgerClaim[]>();\n for (const claim of claims) {\n const domain = claim.scope.domain?.trim() || \"uncategorized\";\n grouped.set(domain, [...(grouped.get(domain) ?? []), claim]);\n }\n\n return [...grouped.entries()]\n .map(([domain, members]) => {\n const predicted = mean(members.map((claim) => claim.confidence));\n const actual = mean(members.map((claim) => claim.resolution?.actualConfidence ?? 0.5));\n const error = predicted - actual;\n const tendency: LedgerDomainCalibration[\"tendency\"] =\n Math.abs(error) <= 0.1 ? \"well_calibrated\" : error > 0 ? \"overconfident\" : \"underconfident\";\n return {\n domain,\n count: members.length,\n brierScore: roundMetric(mean(members.map((claim) => claim.resolution?.brierScore ?? 0))),\n meanPredictedConfidence: roundMetric(predicted),\n meanActualConfidence: roundMetric(actual),\n tendency,\n };\n })\n .sort((a, b) => {\n const countOrder = b.count - a.count;\n if (countOrder !== 0) return countOrder;\n return a.domain.localeCompare(b.domain);\n });\n}\n\nfunction buildFlippedClaims(claims: LedgerClaim[]): LedgerFlippedClaim[] {\n const byId = new Map(claims.map((claim) => [claim.id, claim]));\n const groups = new Map<string, LedgerClaim[]>();\n for (const claim of claims) {\n const root = findRootClaimId(claim, byId);\n groups.set(root, [...(groups.get(root) ?? []), claim]);\n }\n\n return [...groups.entries()]\n .map(([rootClaimId, members]) => {\n const sorted = [...members].sort((a, b) => {\n const createdOrder = Date.parse(a.createdAt) - Date.parse(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n });\n let flipCount = 0;\n for (let i = 1; i < sorted.length; i += 1) {\n if (sorted[i - 1]?.stance !== sorted[i]?.stance) flipCount += 1;\n }\n if (flipCount === 0) return null;\n return {\n rootClaimId,\n claimIds: sorted.map((claim) => claim.id),\n statements: sorted.map((claim) => claim.statement),\n flipCount,\n };\n })\n .filter((item): item is LedgerFlippedClaim => item !== null)\n .sort((a, b) => {\n const flipOrder = b.flipCount - a.flipCount;\n if (flipOrder !== 0) return flipOrder;\n return a.rootClaimId.localeCompare(b.rootClaimId);\n });\n}\n\nfunction findRootClaimId(claim: LedgerClaim, byId: Map<string, LedgerClaim>): string {\n const seen = new Set<string>();\n let cursor: LedgerClaim | undefined = claim;\n while (cursor) {\n if (seen.has(cursor.id)) return cursor.id;\n seen.add(cursor.id);\n const parentId = cursor.supersedes ?? cursor.parentIds[0];\n if (!parentId) return cursor.id;\n const parent = byId.get(parentId);\n if (!parent) return parentId;\n cursor = parent;\n }\n return claim.id;\n}\n\nfunction buildDormantTopics(claims: LedgerClaim[], nowMs: number, dormantAfterDays: number): LedgerDormantTopic[] {\n if (!Number.isFinite(dormantAfterDays) || dormantAfterDays < 0) {\n throw new Error(`dormantAfterDays must be a non-negative number, got ${String(dormantAfterDays)}`);\n }\n const topics = new Map<string, { lastClaimAt: string; claimCount: number }>();\n for (const claim of claims) {\n const activityAt = claimActivityAt(claim);\n for (const topic of claimTopics(claim)) {\n const existing = topics.get(topic);\n if (!existing || Date.parse(activityAt) > Date.parse(existing.lastClaimAt)) {\n topics.set(topic, {\n lastClaimAt: activityAt,\n claimCount: (existing?.claimCount ?? 0) + 1,\n });\n } else {\n existing.claimCount += 1;\n }\n }\n }\n\n return [...topics.entries()]\n .map(([topic, entry]) => {\n const ageDays = (nowMs - Date.parse(entry.lastClaimAt)) / (24 * 60 * 60 * 1_000);\n return {\n topic,\n lastClaimAt: entry.lastClaimAt,\n daysSilent: Math.max(0, Math.floor(ageDays)),\n claimCount: entry.claimCount,\n };\n })\n .filter((topic) => topic.daysSilent >= dormantAfterDays)\n .sort((a, b) => {\n const daysOrder = b.daysSilent - a.daysSilent;\n if (daysOrder !== 0) return daysOrder;\n return a.topic.localeCompare(b.topic);\n });\n}\n\nfunction claimActivityAt(claim: LedgerClaim): string {\n return Date.parse(claim.updatedAt) >= Date.parse(claim.createdAt) ? claim.updatedAt : claim.createdAt;\n}\n\nfunction claimTopics(claim: LedgerClaim): string[] {\n const seen = new Set<string>();\n const topics: string[] = [];\n for (const topic of [...(claim.scope.domain ? [claim.scope.domain] : []), ...claim.scope.entities]) {\n const trimmed = topic.trim();\n if (!trimmed) continue;\n const key = trimmed.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n topics.push(trimmed);\n }\n return topics;\n}\n\nfunction mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n","import type { MemoryFile, StorageManager } from \"@remnic/core\";\nimport { sanitizeMemoryContent } from \"@remnic/core/sanitize\";\nimport { ContentHashIndex, normalizeAttributePairs } from \"@remnic/core/storage\";\nimport {\n claimFromMemory,\n claimTags,\n claimToStructuredAttributes,\n memoryFrontmatterPatchForClaim,\n mergeClaimPatch,\n normalizeIsoTimestamp,\n remnicMemoryStatusForClaim,\n serializeClaimBody,\n} from \"./schema.js\";\nimport type { LedgerClaim, LedgerClaimKind, LedgerClaimStatus, LedgerStore } from \"./types.js\";\n\nfunction serializeClaimMemoryContent(claim: LedgerClaim): string {\n const attributes = normalizeAttributePairs(claimToStructuredAttributes(claim));\n return `${serializeClaimBody(claim)}\\n[Attributes: ${attributes}]`;\n}\n\nexport interface RemnicLedgerStoreOptions {\n now?: () => Date;\n source?: string;\n writeEntityLinks?: boolean;\n}\n\nexport class RemnicLedgerStore implements LedgerStore {\n private readonly storage: StorageManager;\n private readonly now: () => Date;\n private readonly source: string;\n private readonly shouldWriteEntityLinks: boolean;\n\n constructor(storage: StorageManager, options: RemnicLedgerStoreOptions = {}) {\n this.storage = storage;\n this.now = options.now ?? (() => new Date());\n this.source = options.source ?? \"belief-ledger\";\n this.shouldWriteEntityLinks = options.writeEntityLinks ?? true;\n }\n\n async createClaim(input: Omit<LedgerClaim, \"id\" | \"memoryId\" | \"sourceMemory\">): Promise<LedgerClaim> {\n const pending: LedgerClaim = {\n ...input,\n id: \"pending\",\n memoryId: \"pending\",\n };\n const memoryId = await this.storage.writeMemory(\"fact\", serializeClaimBody(pending), {\n actor: this.source,\n confidence: pending.confidence,\n tags: claimTags(pending),\n entityRef: pending.scope.entities[0],\n source: this.source,\n supersedes: pending.supersedes,\n lineage: pending.parentIds.length > 0 ? pending.parentIds : undefined,\n memoryKind: \"note\",\n validAt: pending.createdAt,\n structuredAttributes: claimToStructuredAttributes(pending),\n status: remnicMemoryStatusForClaim(pending),\n });\n\n const claim = await this.getClaim(memoryId);\n if (!claim) {\n throw new Error(`created claim ${memoryId} could not be read back`);\n }\n await this.writeEntityLinksBestEffort(claim);\n return claim;\n }\n\n async getClaim(id: string): Promise<LedgerClaim | null> {\n const memory = await this.getLedgerMemoryById(id);\n return memory ? this.claimFromMemorySafely(memory) : null;\n }\n\n async listClaims(\n filter: {\n statuses?: LedgerClaimStatus[];\n kinds?: LedgerClaimKind[];\n } = {}\n ): Promise<LedgerClaim[]> {\n const memories = await this.readAllLedgerCandidateMemories();\n const statuses = filter.statuses ? new Set(filter.statuses) : null;\n const kinds = filter.kinds ? new Set(filter.kinds) : null;\n return memories\n .map((memory) => this.claimFromMemorySafely(memory))\n .filter((claim): claim is LedgerClaim => claim !== null)\n .filter((claim) => !statuses || statuses.has(claim.status))\n .filter((claim) => !kinds || kinds.has(claim.kind))\n .sort((a, b) => {\n const updatedOrder = Date.parse(b.updatedAt) - Date.parse(a.updatedAt);\n if (updatedOrder !== 0) return updatedOrder;\n return a.id.localeCompare(b.id);\n });\n }\n\n async updateClaim(id: string, patch: Partial<LedgerClaim>): Promise<LedgerClaim> {\n const memory = await this.getLedgerMemoryById(id);\n const existing = this.claimFromMemorySafely(memory);\n if (!existing) {\n throw new Error(`claim ${id} not found`);\n }\n const updated = mergeClaimPatch(existing, patch, this.now().toISOString());\n\n const contentUpdated = await this.writeClaimMemory(memory, updated, { actor: this.source });\n if (!contentUpdated) {\n throw new Error(`claim ${id} content update failed`);\n }\n\n const reread = await this.getClaim(id);\n if (!reread) {\n throw new Error(`claim ${id} could not be read after update`);\n }\n await this.writeEntityLinksBestEffort(reread);\n return reread;\n }\n\n async supersedeClaim(priorId: string, newId: string, reason: string): Promise<boolean> {\n const cleanReason = reason.trim();\n if (!cleanReason) {\n throw new Error(\"supersede reason must not be empty\");\n }\n const prior = await this.getClaim(priorId);\n const next = await this.getClaim(newId);\n if (!prior || !next) return false;\n\n const parentIds = [...new Set([...next.parentIds, priorId])];\n await this.updateClaim(newId, {\n supersedes: priorId,\n parentIds,\n updatedAt: this.now().toISOString(),\n });\n\n try {\n await this.updateClaim(priorId, {\n status: \"superseded\",\n supersededBy: newId,\n updatedAt: this.now().toISOString(),\n });\n } catch (error) {\n const restored = await this.restoreClaimBestEffort(next);\n if (!restored) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`claim ${newId} rollback failed after prior supersession update failed: ${message}`);\n }\n throw error;\n }\n\n await this.writeSupersessionCorrectionBestEffort(prior, next, cleanReason);\n return true;\n }\n\n private async getLedgerMemoryById(id: string): Promise<MemoryFile | null> {\n const memories = await this.readAllLedgerCandidateMemories();\n return memories.find((memory) => memory.frontmatter.id === id) ?? null;\n }\n\n private async readAllLedgerCandidateMemories(): Promise<MemoryFile[]> {\n const [hot, cold, archived] = await Promise.all([\n this.storage.readAllMemories(),\n this.storage.readAllColdMemories(),\n this.storage.readArchivedMemories(),\n ]);\n const byId = new Map<string, MemoryFile>();\n for (const memory of [...hot, ...cold, ...archived]) {\n if (!byId.has(memory.frontmatter.id)) {\n byId.set(memory.frontmatter.id, memory);\n }\n }\n return [...byId.values()];\n }\n\n private async writeClaimMemory(\n memory: MemoryFile | null,\n claim: LedgerClaim,\n options: { actor: string }\n ): Promise<boolean> {\n if (!memory) return false;\n const sanitized = sanitizeMemoryContent(serializeClaimMemoryContent(claim));\n const relatedMemoryIds = [\n ...(claim.supersedes ? [claim.supersedes] : []),\n ...(claim.supersededBy ? [claim.supersededBy] : []),\n ...claim.parentIds,\n ];\n return this.storage.writeMemoryFrontmatter(\n { ...memory, content: sanitized.text },\n {\n ...memoryFrontmatterPatchForClaim(claim),\n contentHash: ContentHashIndex.computeHash(sanitized.text),\n },\n {\n actor: options.actor,\n reasonCode: \"belief-ledger-update\",\n relatedMemoryIds,\n }\n );\n }\n\n private async restoreClaimBestEffort(claim: LedgerClaim): Promise<boolean> {\n try {\n return await this.writeClaimMemory(claim.sourceMemory ?? (await this.getLedgerMemoryById(claim.id)), claim, {\n actor: this.source,\n });\n } catch {\n return false;\n }\n }\n\n private async writeSupersessionCorrectionBestEffort(\n prior: LedgerClaim,\n next: LedgerClaim,\n reason: string\n ): Promise<void> {\n try {\n await this.storage.writeMemory(\n \"correction\",\n `Superseded: ${prior.statement}\\n\\nReplacement: ${next.statement}\\n\\nReason: ${reason}`,\n {\n actor: this.source,\n confidence: 1,\n tags: [\"belief-ledger:audit\", \"supersession\", \"auto-resolved\"],\n source: this.source,\n lineage: [prior.id, next.id],\n }\n );\n } catch {\n // The ledger link is already durable; correction memory is an audit side effect.\n }\n }\n\n private claimFromMemorySafely(memory: MemoryFile | null): LedgerClaim | null {\n if (!memory) return null;\n try {\n return claimFromMemory(memory);\n } catch {\n return null;\n }\n }\n\n private async writeEntityLinksBestEffort(claim: LedgerClaim): Promise<void> {\n if (!this.shouldWriteEntityLinks) return;\n try {\n await this.writeEntityLinks(claim);\n } catch {\n // Entity links are an index side effect; the claim itself is already durable.\n }\n }\n\n private async writeEntityLinks(claim: LedgerClaim): Promise<void> {\n const timestamp = normalizeIsoTimestamp(\"createdAt\", claim.createdAt);\n for (const entity of claim.scope.entities) {\n await this.storage.writeEntity(entity, \"topic\", [], {\n timestamp,\n source: this.source,\n structuredSections: [\n {\n key: \"belief-ledger\",\n title: \"Belief Ledger\",\n facts: beliefLedgerEntityFacts(claim),\n },\n ],\n });\n }\n }\n}\n\nfunction beliefLedgerEntityFacts(claim: LedgerClaim): string[] {\n const prefix = `claim=${claim.id}; status=${claim.status}; updatedAt=${claim.updatedAt}`;\n return [\n `${prefix}; ${claim.kind}: ${claim.statement}`,\n `${prefix}; stance=${claim.stance}; confidence=${claim.confidence}`,\n ];\n}\n","import type { LedgerClaim, LedgerRetrievalCandidate, LedgerRetrievalOptions, LedgerStore } from \"./types.js\";\nimport { normalizeIsoTimestamp } from \"./schema.js\";\n\nconst DEFAULT_LIMIT = 8;\nconst STOPWORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"for\",\n \"from\",\n \"has\",\n \"have\",\n \"i\",\n \"in\",\n \"is\",\n \"it\",\n \"of\",\n \"on\",\n \"or\",\n \"that\",\n \"the\",\n \"this\",\n \"to\",\n \"was\",\n \"were\",\n \"will\",\n \"with\",\n]);\n\nexport async function retrievePriorClaims(\n query: LedgerClaim,\n store: LedgerStore,\n options: LedgerRetrievalOptions = {}\n): Promise<LedgerRetrievalCandidate[]> {\n const limit = normalizeLimit(options.limit);\n const referenceTimeMs = Date.parse(normalizeIsoTimestamp(\"retrieval.now\", options.now ?? query.createdAt));\n const includeStatuses = options.includeStatuses ?? [\"active\", \"snoozed\"];\n const claims = (await store.listClaims({ statuses: includeStatuses }))\n .filter((claim) => claim.id !== query.id)\n .filter((claim) => isRetrievableAt(claim, referenceTimeMs));\n\n const semanticScores = options.semantic\n ? await collectSemanticScores(query, claims, limit, options)\n : new Map<string, number>();\n\n const candidates = claims\n .map((claim) => scoreCandidate(query, claim, semanticScores.get(claim.id), referenceTimeMs))\n .filter((candidate) => candidate.score > 0)\n .sort(compareCandidates);\n\n const sliced = candidates.slice(0, limit);\n if (!options.reranker) return sliced;\n\n const reranked = await options.reranker.rerank({ query, candidates: sliced, limit });\n return reranked.slice(0, limit);\n}\n\nfunction isRetrievableAt(claim: LedgerClaim, referenceTimeMs: number): boolean {\n if (claim.status !== \"snoozed\" || !claim.snoozedUntil) return true;\n return Date.parse(claim.snoozedUntil) <= referenceTimeMs;\n}\n\nfunction scoreCandidate(\n query: LedgerClaim,\n claim: LedgerClaim,\n semanticScore: number | undefined,\n referenceTimeMs: number\n): LedgerRetrievalCandidate {\n let score = 0;\n let hasTopicalMatch = false;\n const reasons: string[] = [];\n\n const lexical = jaccard(tokenize(query.statement), tokenize(claim.statement));\n if (lexical > 0) {\n hasTopicalMatch = true;\n const lexicalScore = lexical * 4;\n score += lexicalScore;\n reasons.push(`lexical:${round(lexicalScore)}`);\n }\n\n const entityOverlap = overlap(query.scope.entities.map(normalizeText), claim.scope.entities.map(normalizeText));\n if (entityOverlap > 0) {\n hasTopicalMatch = true;\n const entityScore = entityOverlap * 3;\n score += entityScore;\n reasons.push(`entity:${entityOverlap}`);\n }\n\n if (\n query.scope.domain &&\n claim.scope.domain &&\n normalizeText(query.scope.domain) === normalizeText(claim.scope.domain)\n ) {\n hasTopicalMatch = true;\n score += 2;\n reasons.push(\"domain\");\n }\n\n if (query.stance !== claim.stance && query.stance !== \"uncertain\" && claim.stance !== \"uncertain\") {\n score += 1;\n reasons.push(\"stance-diff\");\n }\n\n const recency = recencyScore(claim.updatedAt, referenceTimeMs);\n if (recency > 0) {\n score += recency;\n reasons.push(`recency:${round(recency)}`);\n }\n\n if (semanticScore !== undefined) {\n const semantic = Math.max(0, Math.min(1, semanticScore)) * 5;\n if (semantic > 0) hasTopicalMatch = true;\n score += semantic;\n reasons.push(`semantic:${round(semantic)}`);\n }\n\n return { claim, score: hasTopicalMatch ? round(score) : 0, reasons };\n}\n\nfunction compareCandidates(a: LedgerRetrievalCandidate, b: LedgerRetrievalCandidate): number {\n const scoreOrder = b.score - a.score;\n if (scoreOrder !== 0) return scoreOrder;\n const updatedOrder = Date.parse(b.claim.updatedAt) - Date.parse(a.claim.updatedAt);\n if (updatedOrder !== 0) return updatedOrder;\n return a.claim.id.localeCompare(b.claim.id);\n}\n\nasync function collectSemanticScores(\n query: LedgerClaim,\n candidates: LedgerClaim[],\n limit: number,\n options: LedgerRetrievalOptions\n): Promise<Map<string, number>> {\n const result = new Map<string, number>();\n if (!options.semantic || candidates.length === 0) return result;\n const scored = await options.semantic.scoreClaims({ query, candidates, limit });\n for (const item of scored) {\n if (!item.claimId.trim()) continue;\n if (!Number.isFinite(item.score)) continue;\n result.set(item.claimId, Math.max(0, Math.min(1, item.score)));\n }\n return result;\n}\n\nfunction normalizeLimit(value: number | undefined): number {\n if (value === undefined) return DEFAULT_LIMIT;\n if (!Number.isInteger(value) || value < 1 || value > 100) {\n throw new Error(`retrieval limit must be an integer in [1, 100], got ${String(value)}`);\n }\n return value;\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeText(value)\n .split(/\\s+/)\n .filter((token) => token.length >= 2)\n .filter((token) => !STOPWORDS.has(token));\n}\n\nfunction normalizeText(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .trim();\n}\n\nfunction jaccard(left: string[], right: string[]): number {\n if (left.length === 0 || right.length === 0) return 0;\n const leftSet = new Set(left);\n const rightSet = new Set(right);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) intersection += 1;\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union === 0 ? 0 : intersection / union;\n}\n\nfunction overlap(left: string[], right: string[]): number {\n const rightSet = new Set(right.filter(Boolean));\n let count = 0;\n for (const item of new Set(left.filter(Boolean))) {\n if (rightSet.has(item)) count += 1;\n }\n return count;\n}\n\nfunction recencyScore(updatedAt: string, referenceTimeMs: number): number {\n const ageMs = referenceTimeMs - Date.parse(updatedAt);\n if (!Number.isFinite(ageMs) || ageMs < 0) return 0;\n const ageDays = ageMs / (24 * 60 * 60 * 1_000);\n if (ageDays > 365) return 0;\n return (365 - ageDays) / 365;\n}\n\nfunction round(value: number): number {\n return Math.round(value * 1_000) / 1_000;\n}\n","import type { StorageManager } from \"@remnic/core\";\nimport { buildReflectionReport } from \"./reflection.js\";\nimport { RemnicLedgerStore, type RemnicLedgerStoreOptions } from \"./remnic-store.js\";\nimport { retrievePriorClaims } from \"./retrieval.js\";\nimport { createResolution, normalizeClaimDraft, normalizeIsoTimestamp } from \"./schema.js\";\nimport type {\n LedgerCaptureInput,\n LedgerCaptureResult,\n LedgerChallenge,\n LedgerClaim,\n LedgerClaimDraft,\n LedgerCrossExaminationResult,\n LedgerCrossExaminationStats,\n LedgerJudgeResult,\n LedgerLlmAdapter,\n LedgerPredictionScoreResult,\n LedgerReflectionOptions,\n LedgerReflectionReport,\n LedgerRetrievalOptions,\n LedgerScoreDuePredictionsOptions,\n LedgerStore,\n} from \"./types.js\";\n\nexport interface BeliefLedgerOptions {\n store: LedgerStore;\n llm: LedgerLlmAdapter;\n retrieval?: LedgerRetrievalOptions;\n now?: () => Date;\n}\n\nexport interface BeliefLedgerFromStorageOptions extends RemnicLedgerStoreOptions {\n llm: LedgerLlmAdapter;\n retrieval?: LedgerRetrievalOptions;\n}\n\nexport interface ResolveClaimInput {\n verdict: \"true\" | \"false\" | \"mixed\" | \"unknown\";\n actualConfidence: number;\n source?: string;\n notes?: string;\n resolvedAt?: string;\n}\n\nexport class BeliefLedger {\n private readonly store: LedgerStore;\n private readonly llm: LedgerLlmAdapter;\n private readonly retrieval: LedgerRetrievalOptions;\n private readonly now: () => Date;\n\n constructor(options: BeliefLedgerOptions) {\n this.store = options.store;\n this.llm = options.llm;\n this.retrieval = options.retrieval ?? {};\n this.now = options.now ?? (() => new Date());\n }\n\n static fromStorage(storage: StorageManager, options: BeliefLedgerFromStorageOptions): BeliefLedger {\n return new BeliefLedger({\n store: new RemnicLedgerStore(storage, options),\n llm: options.llm,\n retrieval: options.retrieval,\n now: options.now,\n });\n }\n\n async capture(input: LedgerCaptureInput): Promise<LedgerCaptureResult> {\n const now = normalizeIsoTimestamp(\"now\", input.now ?? this.now().toISOString());\n const draft = await this.llm.extractClaim({ ...input, now });\n const normalized = normalizeClaimDraft(draft, { now, sourceText: input.text });\n const claim = await this.store.createClaim(normalized);\n const examination = await this.crossExamine(claim, { now });\n return { ...examination, claim };\n }\n\n async crossExamine(\n claimOrId: LedgerClaim | string,\n options: LedgerRetrievalOptions = {}\n ): Promise<LedgerCrossExaminationResult> {\n const claim = typeof claimOrId === \"string\" ? await this.requireClaim(claimOrId) : claimOrId;\n const retrievalOptions: LedgerRetrievalOptions = {\n ...this.retrieval,\n ...options,\n now: options.now ?? this.retrieval.now ?? this.now().toISOString(),\n };\n const candidates = await retrievePriorClaims(claim, this.store, retrievalOptions);\n const judgments: LedgerJudgeResult[] = [];\n for (const candidate of candidates) {\n const judgment = await this.llm.judgeClaimPair({\n current: claim,\n prior: candidate.claim,\n });\n judgments.push({\n ...judgment,\n priorClaimId: candidate.claim.id,\n });\n }\n\n const contradictions = judgments\n .map((judgment) => ({\n judgment,\n claim: candidates.find((candidate) => candidate.claim.id === judgment.priorClaimId)?.claim,\n }))\n .filter(\n (item): item is { judgment: LedgerJudgeResult; claim: LedgerClaim } =>\n item.claim !== undefined && item.judgment.classification === \"contradiction\"\n );\n\n const challenge: LedgerChallenge | undefined =\n contradictions.length > 0\n ? await this.llm.draftSocraticChallenge({\n current: claim,\n contradictions,\n })\n : undefined;\n\n return {\n claim,\n candidates,\n judgments,\n ...(challenge ? { challenge } : {}),\n stats: buildCrossExaminationStats(judgments),\n };\n }\n\n async supersede(priorId: string, newId: string, reason: string): Promise<boolean> {\n return this.store.supersedeClaim(priorId, newId, reason);\n }\n\n async split(\n priorId: string,\n parts: LedgerClaimDraft[],\n reason: string = \"split into narrower claims\"\n ): Promise<LedgerClaim[]> {\n if (parts.length === 0) {\n throw new Error(\"split requires at least one part\");\n }\n const prior = await this.requireClaim(priorId);\n const now = this.now().toISOString();\n const normalizedParts = parts.map((part) => ({\n ...normalizeClaimDraft(part, {\n now,\n sourceText: prior.sourceText ?? prior.statement,\n }),\n parentIds: [priorId],\n }));\n const created: LedgerClaim[] = [];\n try {\n for (const part of normalizedParts) {\n created.push(await this.store.createClaim(part));\n }\n } catch (error) {\n await rollbackCreatedSplitClaims(this.store, created, now, `split creation failed for ${priorId}`);\n throw error;\n }\n\n const firstReplacement = created[0]!;\n let didSupersede = false;\n try {\n didSupersede = await this.store.supersedeClaim(priorId, firstReplacement.id, reason);\n } catch (error) {\n await rollbackCreatedSplitClaims(this.store, created, now, `split supersession failed for ${priorId}`);\n throw error;\n }\n if (!didSupersede) {\n await rollbackCreatedSplitClaims(this.store, created, now, `split supersession failed for ${priorId}`);\n throw new Error(`split could not supersede prior claim ${priorId} with ${firstReplacement.id}`);\n }\n const linkedFirst = await this.store.getClaim(firstReplacement.id);\n if (!linkedFirst) {\n throw new Error(`split replacement claim ${firstReplacement.id} disappeared after supersession`);\n }\n created[0] = linkedFirst;\n return created;\n }\n\n async resolve(claimId: string, input: ResolveClaimInput): Promise<LedgerClaim> {\n const claim = await this.requireClaim(claimId);\n const resolvedAt = normalizeIsoTimestamp(\"resolvedAt\", input.resolvedAt ?? this.now().toISOString());\n const resolution = createResolution({\n verdict: input.verdict,\n actualConfidence: input.actualConfidence,\n resolvedAt,\n source: input.source,\n notes: input.notes,\n predictedConfidence: claim.confidence,\n });\n return this.store.updateClaim(claimId, {\n status: \"resolved\",\n resolution,\n updatedAt: resolvedAt,\n });\n }\n\n async snooze(claimId: string, until: string): Promise<LedgerClaim> {\n const snoozedUntil = normalizeIsoTimestamp(\"snoozedUntil\", until);\n return this.store.updateClaim(claimId, {\n status: \"snoozed\",\n snoozedUntil,\n updatedAt: this.now().toISOString(),\n });\n }\n\n async ignore(claimId: string, reason?: string): Promise<LedgerClaim> {\n const ignoredAt = this.now().toISOString();\n return this.store.updateClaim(claimId, {\n status: \"ignored\",\n ignoredAt,\n ...(reason?.trim() ? { ignoredReason: reason.trim() } : {}),\n updatedAt: ignoredAt,\n });\n }\n\n async scoreDuePredictions(options: LedgerScoreDuePredictionsOptions = {}): Promise<LedgerPredictionScoreResult[]> {\n const now = normalizeIsoTimestamp(\"now\", options.now ?? this.now().toISOString());\n const limit = normalizeLimit(options.limit);\n const verdictSources = options.verdictSources ?? {};\n const due = (await this.store.listClaims({ kinds: [\"prediction\"], statuses: [\"active\", \"snoozed\"] }))\n .filter((claim) => isDueForScoring(claim, now))\n .sort(compareDuePredictions)\n .slice(0, limit);\n\n const results: LedgerPredictionScoreResult[] = [];\n for (const claim of due) {\n const verdictSource = verdictSources[claim.id];\n if (!verdictSource?.trim()) {\n results.push({\n claim,\n status: \"needs_user_verdict\",\n prompt: `Prediction deadline passed: \"${claim.statement}\". What actually happened?`,\n });\n continue;\n }\n if (!this.llm.gradePrediction) {\n results.push({\n claim,\n status: \"needs_user_verdict\",\n prompt: `Prediction deadline passed: \"${claim.statement}\". Provide a verdict because no grader is configured.`,\n });\n continue;\n }\n try {\n const grade = await this.llm.gradePrediction({ claim, verdictSource, now });\n if (!grade) {\n results.push({\n claim,\n status: \"needs_user_verdict\",\n prompt: `Prediction deadline passed: \"${claim.statement}\". The verdict source was not enough to grade it.`,\n });\n continue;\n }\n const resolution = createResolution({\n verdict: grade.verdict,\n actualConfidence: grade.actualConfidence,\n resolvedAt: now,\n source: grade.source ?? verdictSource,\n notes: grade.rationale,\n predictedConfidence: claim.confidence,\n });\n const updated = await this.store.updateClaim(claim.id, {\n status: \"resolved\",\n resolution,\n updatedAt: now,\n });\n results.push({\n claim: updated,\n status: \"resolved\",\n resolution,\n });\n } catch (error) {\n results.push({\n claim,\n status: \"skipped\",\n reason: `prediction scoring failed: ${errorMessage(error)}`,\n });\n }\n }\n return results;\n }\n\n async reflect(options: LedgerReflectionOptions = {}): Promise<LedgerReflectionReport> {\n const claims = await this.store.listClaims();\n return buildReflectionReport(claims, {\n ...options,\n now: options.now ?? this.now().toISOString(),\n });\n }\n\n private async requireClaim(id: string): Promise<LedgerClaim> {\n const claim = await this.store.getClaim(id);\n if (!claim) {\n throw new Error(`claim ${id} not found`);\n }\n return claim;\n }\n}\n\nfunction buildCrossExaminationStats(judgments: Array<{ classification: string }>): LedgerCrossExaminationStats {\n const judged = judgments.length;\n const contradictions = judgments.filter((judgment) => judgment.classification === \"contradiction\").length;\n const unrelated = judgments.filter((judgment) => judgment.classification === \"unrelated\").length;\n return {\n candidatesConsidered: judged,\n judged,\n contradictions,\n unrelated,\n observableFalsePositiveRate: judged === 0 ? 0 : unrelated / judged,\n };\n}\n\nasync function rollbackCreatedSplitClaims(\n store: LedgerStore,\n claims: LedgerClaim[],\n now: string,\n ignoredReason: string\n): Promise<void> {\n for (const claim of claims) {\n try {\n await store.updateClaim(claim.id, {\n status: \"ignored\",\n ignoredAt: now,\n ignoredReason,\n updatedAt: now,\n });\n } catch {\n // Rollback is best-effort; preserve the original split failure.\n }\n }\n}\n\nfunction isDueForScoring(claim: LedgerClaim, nowIso: string): boolean {\n if (!claim.deadline) return false;\n if (claim.resolution) return false;\n if (claim.status === \"snoozed\" && claim.snoozedUntil && Date.parse(claim.snoozedUntil) > Date.parse(nowIso)) {\n return false;\n }\n return Date.parse(claim.deadline) <= Date.parse(nowIso);\n}\n\nfunction compareDuePredictions(a: LedgerClaim, b: LedgerClaim): number {\n const aDeadline = a.deadline ? Date.parse(a.deadline) : Number.POSITIVE_INFINITY;\n const bDeadline = b.deadline ? Date.parse(b.deadline) : Number.POSITIVE_INFINITY;\n const deadlineOrder = aDeadline - bDeadline;\n if (deadlineOrder !== 0) return deadlineOrder;\n const updatedOrder = Date.parse(a.updatedAt) - Date.parse(b.updatedAt);\n if (updatedOrder !== 0) return updatedOrder;\n return a.id.localeCompare(b.id);\n}\n\nfunction normalizeLimit(value: number | undefined): number {\n if (value === undefined) return 100;\n if (!Number.isInteger(value) || value < 1 || value > 1_000) {\n throw new Error(`limit must be an integer in [1, 1000], got ${String(value)}`);\n }\n return value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { FallbackLlmClient, FallbackLlmOptions } from \"@remnic/core\";\nimport { normalizeChallenge, normalizeClaimDraft, normalizeJudgeResult, normalizePredictionGrade } from \"./schema.js\";\nimport type {\n LedgerChallenge,\n LedgerClaim,\n LedgerClaimDraft,\n LedgerJudgeResult,\n LedgerLlmAdapter,\n LedgerPredictionGrade,\n} from \"./types.js\";\n\nexport interface FallbackLlmLedgerAdapterOptions extends FallbackLlmOptions {\n agentId?: string;\n}\n\nexport function createFallbackLlmLedgerAdapter(\n client: FallbackLlmClient,\n options: FallbackLlmLedgerAdapterOptions = {}\n): LedgerLlmAdapter {\n const baseOptions = { ...options };\n return {\n async extractClaim(request): Promise<LedgerClaimDraft> {\n const parsed = await client.parseWithSchema(\n [\n { role: \"system\", content: EXTRACT_PROMPT },\n {\n role: \"user\",\n content: [\n `Current time: ${request.now}`,\n request.sessionKey ? `Session: ${request.sessionKey}` : \"\",\n \"User text:\",\n request.text,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n },\n ],\n {\n parse: (data: unknown) => normalizeExtractedDraft(data, request.now, request.text),\n },\n { ...baseOptions, temperature: baseOptions.temperature ?? 0.1, maxTokens: baseOptions.maxTokens ?? 1_200 }\n );\n if (!parsed) {\n throw new Error(\"belief-ledger extraction LLM did not return a valid claim\");\n }\n return parsed;\n },\n\n async judgeClaimPair(request): Promise<LedgerJudgeResult> {\n const parsed = await client.parseWithSchema(\n [\n { role: \"system\", content: JUDGE_PROMPT },\n { role: \"user\", content: formatJudgeInput(request.current, request.prior) },\n ],\n {\n parse: (data: unknown) => normalizeJudgeResult(data, request.prior.id),\n },\n { ...baseOptions, temperature: baseOptions.temperature ?? 0.1, maxTokens: baseOptions.maxTokens ?? 800 }\n );\n if (!parsed) {\n throw new Error(\"belief-ledger judge LLM did not return a valid verdict\");\n }\n return parsed;\n },\n\n async draftSocraticChallenge(request): Promise<LedgerChallenge> {\n const priorClaimIds = request.contradictions.map((item) => item.claim.id);\n const parsed = await client.parseWithSchema(\n [\n { role: \"system\", content: CHALLENGE_PROMPT },\n {\n role: \"user\",\n content: [\n \"Current claim:\",\n formatClaim(request.current),\n \"\",\n \"Contradicting prior claims:\",\n ...request.contradictions.map(\n (item) => `${formatClaim(item.claim)}\\nJudge rationale: ${item.judgment.rationale}`\n ),\n ].join(\"\\n\"),\n },\n ],\n {\n parse: (data: unknown) => normalizeChallenge(data, priorClaimIds),\n },\n { ...baseOptions, temperature: baseOptions.temperature ?? 0.2, maxTokens: baseOptions.maxTokens ?? 800 }\n );\n if (!parsed) {\n throw new Error(\"belief-ledger challenge LLM did not return a valid prompt\");\n }\n return parsed;\n },\n\n async gradePrediction(request): Promise<LedgerPredictionGrade | null> {\n if (!request.verdictSource?.trim()) return null;\n const parsed = await client.parseWithSchema(\n [\n { role: \"system\", content: GRADE_PROMPT },\n {\n role: \"user\",\n content: [\n `Current time: ${request.now}`,\n \"Prediction:\",\n formatClaim(request.claim),\n \"\",\n \"Verdict source:\",\n request.verdictSource,\n ].join(\"\\n\"),\n },\n ],\n {\n parse: (data: unknown) => normalizePredictionGrade(data),\n },\n { ...baseOptions, temperature: baseOptions.temperature ?? 0.1, maxTokens: baseOptions.maxTokens ?? 800 }\n );\n return parsed;\n },\n };\n}\n\nconst EXTRACT_PROMPT = `Extract one belief-ledger claim from the user's text.\n\nReturn JSON only:\n{\n \"statement\": \"single clear claim or prediction\",\n \"kind\": \"claim\" | \"prediction\" | \"opinion\",\n \"stance\": \"for\" | \"against\" | \"uncertain\" | \"neutral\",\n \"confidence\": 0.0,\n \"scope\": {\n \"entities\": [\"entity names\"],\n \"domain\": \"optional topic\",\n \"timeWindow\": { \"start\": \"optional ISO\", \"end\": \"optional ISO\" }\n },\n \"deadline\": \"optional ISO timestamp for predictions\",\n \"evidenceLinks\": [\"optional source URLs or identifiers\"]\n}\n\nUse the user's stated confidence when present. If no confidence is stated, estimate conservatively.`;\n\nconst JUDGE_PROMPT = `Classify how the current claim relates to the prior claim.\n\nReturn JSON only:\n{\n \"classification\": \"contradiction\" | \"evolution\" | \"refinement\" | \"unrelated\",\n \"confidence\": 0.0,\n \"rationale\": \"brief reason\"\n}\n\nUse \"contradiction\" only when both claims cannot comfortably be true at the same time under their stated scope.`;\n\nconst CHALLENGE_PROMPT = `Draft one concise Socratic challenge for the user.\n\nReturn JSON only:\n{\n \"question\": \"one question asking the user to reconcile the conflict\",\n \"priorClaimIds\": [\"ids involved\"],\n \"suggestedActions\": [\"supersede\", \"split\", \"resolve\", \"ignore\"]\n}\n\nDo not agree with the user by default. Ask for a reconciliation decision.`;\n\nconst GRADE_PROMPT = `Grade whether the prediction came true from the supplied verdict source.\n\nReturn JSON only:\n{\n \"verdict\": \"true\" | \"false\" | \"mixed\" | \"unknown\",\n \"actualConfidence\": 0.0,\n \"rationale\": \"brief reason\",\n \"source\": \"short source label\"\n}\n\nUse actualConfidence 1 for true, 0 for false, a fractional value for mixed, and 0.5 for unknown.`;\n\nfunction normalizeExtractedDraft(data: unknown, now: string, sourceText: string): LedgerClaimDraft {\n if (!isRecord(data)) {\n throw new Error(\"claim extraction result must be an object\");\n }\n const scope = isRecord(data.scope) ? data.scope : {};\n const rawTimeWindow = isRecord(scope.timeWindow)\n ? scope.timeWindow\n : isRecord(scope.time_window)\n ? scope.time_window\n : undefined;\n const draft: LedgerClaimDraft = {\n statement: asString(data.statement),\n kind: optionalString(data.kind) as LedgerClaimDraft[\"kind\"],\n stance: asString(data.stance) as LedgerClaimDraft[\"stance\"],\n confidence: asNumber(data.confidence),\n scope: {\n entities: Array.isArray(scope.entities)\n ? scope.entities.filter((value): value is string => typeof value === \"string\")\n : [],\n ...(typeof scope.domain === \"string\" ? { domain: scope.domain } : {}),\n ...(rawTimeWindow\n ? {\n timeWindow: {\n ...(typeof rawTimeWindow.start === \"string\" ? { start: rawTimeWindow.start } : {}),\n ...(typeof rawTimeWindow.end === \"string\" ? { end: rawTimeWindow.end } : {}),\n },\n }\n : {}),\n },\n ...(typeof data.deadline === \"string\" && data.deadline.trim() ? { deadline: data.deadline } : {}),\n evidenceLinks: Array.isArray(data.evidenceLinks)\n ? data.evidenceLinks.filter((value): value is string => typeof value === \"string\")\n : Array.isArray(data.evidence_links)\n ? data.evidence_links.filter((value): value is string => typeof value === \"string\")\n : [],\n };\n const normalized = normalizeClaimDraft(draft, { now, sourceText });\n return {\n statement: normalized.statement,\n kind: normalized.kind,\n stance: normalized.stance,\n confidence: normalized.confidence,\n scope: normalized.scope,\n ...(normalized.deadline ? { deadline: normalized.deadline } : {}),\n evidenceLinks: normalized.evidenceLinks,\n };\n}\n\nfunction formatJudgeInput(current: LedgerClaim, prior: LedgerClaim): string {\n return [\"Current claim:\", formatClaim(current), \"\", \"Prior claim:\", formatClaim(prior)].join(\"\\n\");\n}\n\nfunction formatClaim(claim: LedgerClaim): string {\n return [\n `id: ${claim.id}`,\n `created: ${claim.createdAt}`,\n `statement: ${claim.statement}`,\n `kind: ${claim.kind}`,\n `stance: ${claim.stance}`,\n `confidence: ${claim.confidence}`,\n `domain: ${claim.scope.domain ?? \"\"}`,\n `entities: ${claim.scope.entities.join(\", \")}`,\n `timeWindow.start: ${claim.scope.timeWindow?.start ?? \"\"}`,\n `timeWindow.end: ${claim.scope.timeWindow?.end ?? \"\"}`,\n `deadline: ${claim.deadline ?? \"\"}`,\n `status: ${claim.status}`,\n ].join(\"\\n\");\n}\n\nfunction asString(value: unknown): string {\n if (typeof value !== \"string\") {\n throw new Error(\"expected string\");\n }\n return value;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim()) return Number(value);\n throw new Error(\"expected number\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["normalizeLimit","isRecord"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@remnic/belief-ledger",
3
+ "version": "9.3.596",
4
+ "description": "Belief and prediction ledger library built on Remnic memory primitives",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup src/index.ts --format esm --dts",
20
+ "precheck-types": "node ../../scripts/ensure-bench-build-deps.mjs",
21
+ "check-types": "tsc --noEmit",
22
+ "pretest": "node ../../scripts/ensure-bench-build-deps.mjs",
23
+ "test": "tsx --test src/*.test.ts",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public",
28
+ "provenance": true
29
+ },
30
+ "peerDependencies": {
31
+ "@remnic/core": "^9.3.596"
32
+ },
33
+ "devDependencies": {
34
+ "@remnic/core": "workspace:*",
35
+ "tsup": "^8.0.0",
36
+ "tsx": "^4.0.0",
37
+ "typescript": "^5.7.0"
38
+ },
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/joshuaswarren/remnic.git",
43
+ "directory": "packages/belief-ledger"
44
+ },
45
+ "keywords": [
46
+ "remnic",
47
+ "memory",
48
+ "beliefs",
49
+ "prediction",
50
+ "calibration",
51
+ "ledger"
52
+ ]
53
+ }