bilmem 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -20
- package/dist/{canonical-CglQQ0xc.d.ts → canonical-JS6HUWGc.d.ts} +24 -1
- package/dist/cli/index.js +1433 -200
- package/dist/cli/index.js.map +1 -1
- package/dist/core/index.d.ts +52 -5
- package/dist/core/index.js +623 -1
- package/dist/core/index.js.map +1 -1
- package/dist/{filesystem-B3qAej0l.d.ts → filesystem-CrAkhr85.d.ts} +1 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.js +1451 -303
- package/dist/index.js.map +1 -1
- package/dist/install/index.d.ts +59 -3
- package/dist/install/index.js +1245 -111
- package/dist/install/index.js.map +1 -1
- package/dist/jev/index.d.ts +1 -1
- package/dist/mcp/index.d.ts +12 -1
- package/dist/mcp/index.js +846 -97
- package/dist/mcp/index.js.map +1 -1
- package/dist/rules/index.d.ts +2 -2
- package/dist/rules/index.js.map +1 -1
- package/dist/scanner/index.d.ts +2 -2
- package/dist/scanner/index.js +6 -1
- package/dist/scanner/index.js.map +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/stats/index.d.ts +3 -3
- package/dist/stats/index.js +45 -1
- package/dist/stats/index.js.map +1 -1
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +6 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/{types-Nxq5Gzay.d.ts → types-DNlvHsj9.d.ts} +120 -3
- package/package.json +1 -1
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/relations.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/core/unknown.ts","../../src/core/outcome.ts","../../src/core/learn.ts","../../src/core/dependencies.ts","../../src/jev/scorer.ts","../../src/jev/matcher.ts","../../src/search/indexer.ts","../../src/search/retriever.ts","../../src/core/resolver.ts"],"sourcesContent":["import type { EvidenceRelation, RelationType } from './types.js';\n\n/**\n * Lightweight, in-memory graph structure for managing relations between\n * files, observations, evidence, and knowledge nodes.\n */\nexport class EvidenceGraph {\n private fromMap = new Map<string, EvidenceRelation[]>();\n private toMap = new Map<string, EvidenceRelation[]>();\n\n constructor(relations: EvidenceRelation[] = []) {\n for (const rel of relations) {\n this.addRelation(rel);\n }\n }\n\n addRelation(relation: EvidenceRelation): void {\n if (!relation || !relation.from || !relation.to || !relation.type) {\n return;\n }\n\n // Prevent identical duplicate edges\n const existing = this.getRelationsBetween(relation.from, relation.to);\n const dup = existing.find((r) => r.type === relation.type);\n if (dup) {\n // If weight differs, increase weight\n dup.weight = (dup.weight ?? 1) + (relation.weight ?? 1);\n return;\n }\n\n const fromList = this.fromMap.get(relation.from) ?? [];\n fromList.push(relation);\n this.fromMap.set(relation.from, fromList);\n\n const toList = this.toMap.get(relation.to) ?? [];\n toList.push(relation);\n this.toMap.set(relation.to, toList);\n }\n\n getRelationsFrom(fromId: string): EvidenceRelation[] {\n return this.fromMap.get(fromId) ?? [];\n }\n\n getRelationsTo(toId: string): EvidenceRelation[] {\n return this.toMap.get(toId) ?? [];\n }\n\n getRelationsBetween(fromId: string, toId: string): EvidenceRelation[] {\n const fromList = this.fromMap.get(fromId);\n if (!fromList) return [];\n return fromList.filter((r) => r.to === toId);\n }\n\n getAllRelations(): EvidenceRelation[] {\n const all: EvidenceRelation[] = [];\n for (const list of this.fromMap.values()) {\n all.push(...list);\n }\n return all;\n }\n\n findCoChanged(file: string, threshold = 1): Array<{ file: string; weight: number }> {\n const relations = this.getRelationsFrom(file).filter((r) => r.type === 'CO_CHANGED');\n const result: Array<{ file: string; weight: number }> = [];\n\n for (const rel of relations) {\n const w = rel.weight ?? 1;\n if (w >= threshold) {\n result.push({ file: rel.to, weight: w });\n }\n }\n\n return result.sort((a, b) => b.weight - a.weight);\n }\n\n findConnected(id: string, maxDepth = 2): string[] {\n const visited = new Set<string>();\n const queue: Array<{ node: string; depth: number }> = [{ node: id, depth: 0 }];\n\n while (queue.length > 0) {\n const { node, depth } = queue.shift()!;\n if (visited.has(node)) continue;\n visited.add(node);\n\n if (depth < maxDepth) {\n const outRels = this.getRelationsFrom(node);\n for (const r of outRels) {\n if (!visited.has(r.to)) {\n queue.push({ node: r.to, depth: depth + 1 });\n }\n }\n const inRels = this.getRelationsTo(node);\n for (const r of inRels) {\n if (!visited.has(r.from)) {\n queue.push({ node: r.from, depth: depth + 1 });\n }\n }\n }\n }\n\n visited.delete(id);\n return Array.from(visited);\n }\n\n toJSON(): EvidenceRelation[] {\n return this.getAllRelations();\n }\n\n static fromJSON(relations: EvidenceRelation[]): EvidenceGraph {\n return new EvidenceGraph(relations);\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: params.statement.trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type {\n UnknownRecord,\n UnknownState,\n UnknownReason,\n UnknownNextAction,\n Scope\n} from './types.js';\n\nexport function createUnknown(params: {\n id: string;\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n checked?: string[];\n next?: UnknownNextAction;\n scope?: Scope;\n}): UnknownRecord {\n const now = new Date().toISOString();\n return {\n id: params.id.trim(),\n state: params.state ?? 'UNKNOWN',\n reason: params.reason ?? 'NOT_OBSERVED',\n statement: params.statement?.trim(),\n checked: Array.from(new Set(params.checked?.map((c) => c.trim()) ?? [])),\n next: params.next,\n scope: params.scope ?? 'project',\n createdAt: now,\n updatedAt: now\n };\n}\n\n/**\n * Checks if a specific path or query was already investigated,\n * helping agents avoid repeating useless investigations.\n */\nexport function hasBeenInvestigated(\n unknowns: UnknownRecord[],\n target: string\n): { investigated: boolean; record?: UnknownRecord; reason?: string } {\n const normalizedTarget = target.trim().toLowerCase();\n\n for (const record of unknowns) {\n if (record.id.toLowerCase() === normalizedTarget) {\n return { investigated: true, record, reason: record.reason };\n }\n\n const checkedMatch = record.checked.some((c) => {\n const nc = c.toLowerCase();\n return nc === normalizedTarget || normalizedTarget.startsWith(nc.replace('/**', ''));\n });\n\n if (checkedMatch) {\n return { investigated: true, record, reason: record.reason };\n }\n }\n\n return { investigated: false };\n}\n\n/**\n * Update an existing unknown with new checked paths or update its state when partially known or resolved.\n */\nexport function updateUnknown(\n record: UnknownRecord,\n updates: {\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n addChecked?: string[];\n next?: UnknownNextAction;\n }\n): UnknownRecord {\n const checked = new Set(record.checked);\n if (updates.addChecked) {\n for (const c of updates.addChecked) {\n checked.add(c.trim());\n }\n }\n\n return {\n ...record,\n state: updates.state ?? record.state,\n reason: updates.reason ?? record.reason,\n statement: updates.statement !== undefined ? updates.statement : record.statement,\n checked: Array.from(checked),\n next: updates.next !== undefined ? updates.next : record.next,\n updatedAt: new Date().toISOString()\n };\n}\n","import { hashString, calculateEffectiveConfidence } from './knowledge.js';\nimport type {\n OutcomeRecord,\n OutcomeType,\n Knowledge,\n BilmemMetrics\n} from './types.js';\n\nexport function createOutcome(params: {\n knowledgeId?: string;\n taskId?: string;\n result: OutcomeType;\n context?: {\n positive?: string[];\n negative?: string[];\n };\n feedback?: string;\n}): OutcomeRecord {\n const content = `${params.knowledgeId || 'none'}:${params.result}:${Date.now()}`;\n return {\n id: `out_${hashString(content)}`,\n knowledgeId: params.knowledgeId,\n taskId: params.taskId,\n result: params.result,\n context: params.context,\n feedback: params.feedback,\n timestamp: new Date().toISOString()\n };\n}\n\n/**\n * Apply outcome to a knowledge unit and recalculate its confidence.\n */\nexport function applyOutcomeToKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): Knowledge {\n const now = new Date().toISOString();\n knowledge.metrics.reuse_count++;\n knowledge.metrics.last_used = now;\n\n if (outcome.result === 'success') {\n knowledge.metrics.successful_outcomes++;\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n knowledge.metrics.failed_outcomes++;\n }\n\n // Recalculate effective confidence\n knowledge.confidence = calculateEffectiveConfidence(knowledge);\n knowledge.updatedAt = now;\n return knowledge;\n}\n\nexport class MetricsTracker {\n private metrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n\n constructor(initial?: Partial<BilmemMetrics>) {\n if (initial) {\n this.metrics = { ...this.metrics, ...initial };\n }\n }\n\n recordHit(): void {\n this.metrics.knowledgeHits++;\n }\n\n recordMiss(): void {\n this.metrics.knowledgeMisses++;\n }\n\n recordReused(): void {\n this.metrics.knowledgeReused++;\n }\n\n recordUnknownResolved(): void {\n this.metrics.unknownsResolved++;\n }\n\n recordInvestigationPrevented(): void {\n this.metrics.repeatedInvestigationsPrevented++;\n }\n\n recordCandidateMerged(): void {\n this.metrics.candidateKnowledgeMerged++;\n }\n\n recordStaleDetected(): void {\n this.metrics.staleKnowledgeDetected++;\n }\n\n recordContradiction(): void {\n this.metrics.contradictionsDetected++;\n }\n\n recordPromoted(): void {\n this.metrics.knowledgePromoted++;\n }\n\n recordSuperseded(): void {\n this.metrics.knowledgeSuperseded++;\n }\n\n getMetrics(): BilmemMetrics {\n return { ...this.metrics };\n }\n\n toJSON(): BilmemMetrics {\n return this.metrics;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n TaskTrajectory,\n Knowledge,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction\n} from './types.js';\nimport {\n createObservation,\n createEvidence,\n createKnowledge,\n reconcileKnowledge,\n applyReconciliation\n} from './knowledge.js';\n\nexport interface DistilledLesson {\n id: string;\n statement: string;\n positive: string[];\n negative: string[];\n confidence: number;\n evidence: string[];\n tags: string[];\n reasoning: string;\n}\n\nexport interface TrajectoryLearningResult {\n taskId: string;\n observations: Observation[];\n evidence: Evidence[];\n candidateLessons: Array<Partial<Knowledge> & { statement: string }>;\n reconciliations: Array<{\n candidate: Partial<Knowledge> & { statement: string };\n result: ReconciliationResult;\n appliedKnowledge?: Knowledge;\n action: ReconciliationAction;\n }>;\n dryRun: boolean;\n}\n\n/**\n * Distill a task trajectory into a compact, reusable candidate lesson.\n * Avoids dumping raw trajectories into permanent memory;\n * extracts only the crystallized insight (what worked, what failed, negative patterns).\n */\nexport function distillTrajectory(trajectory: TaskTrajectory): DistilledLesson | null {\n const events = trajectory.events || [];\n if (events.length === 0) return null;\n\n const failures = events.filter((e) => e.type === 'failure' || e.type === 'revert');\n const successes = events.filter((e) => e.type === 'success');\n const corrections = events.filter((e) => e.type === 'user_correction');\n\n // If nothing succeeded or no significant signal, do not create spurious memory\n if (successes.length === 0 && corrections.length === 0 && failures.length === 0) {\n return null;\n }\n\n const positiveSignals = new Set<string>();\n const negativeSignals = new Set<string>();\n const tags = new Set<string>(['lesson', 'trajectory']);\n\n // Extract negative signals from failures and rejected hypotheses\n for (const f of failures) {\n negativeSignals.add(f.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (f.path) negativeSignals.add(f.path.toLowerCase());\n }\n\n // Extract positive signals from successful attempts & goal\n for (const s of successes) {\n positiveSignals.add(s.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (s.path) positiveSignals.add(s.path.toLowerCase());\n }\n\n // Extract from user corrections\n for (const c of corrections) {\n positiveSignals.add(c.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n tags.add('user-correction');\n }\n\n // Extract tokens from goal\n const goalTokens = trajectory.goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const t of goalTokens) {\n positiveSignals.add(t);\n }\n\n // Compose statement\n let statement = '';\n let reasoning = '';\n\n if (corrections.length > 0) {\n const lastCorr = corrections[corrections.length - 1];\n statement = `Corrected approach for \"${trajectory.goal}\": ${lastCorr.description}`;\n reasoning = `Based on user correction during task ${trajectory.taskId}`;\n } else if (successes.length > 0) {\n const lastSuccess = successes[successes.length - 1];\n if (failures.length > 0) {\n const firstFailure = failures[0];\n statement = `When addressing \"${trajectory.goal}\": prefer ${lastSuccess.description} over ${firstFailure.description}`;\n reasoning = `Initial attempt (${firstFailure.description}) failed/reverted; resolved by ${lastSuccess.description}`;\n } else {\n statement = `Effective pattern for \"${trajectory.goal}\": ${lastSuccess.description}`;\n reasoning = `Directly succeeded in task ${trajectory.taskId}`;\n }\n } else if (failures.length > 0) {\n const failureList = failures.map((f) => f.description).join(', ');\n statement = `Avoid for \"${trajectory.goal}\": approaches [${failureList}] failed`;\n reasoning = `Recorded ${failures.length} failed attempts in task ${trajectory.taskId}`;\n }\n\n const hash = createHash('sha256')\n .update(`${trajectory.goal}:${statement}`)\n .digest('hex')\n .slice(0, 12);\n const id = `lesson.${trajectory.taskId || hash}`;\n\n return {\n id,\n statement,\n positive: Array.from(positiveSignals).slice(0, 8),\n negative: Array.from(negativeSignals).slice(0, 8),\n confidence: corrections.length > 0 ? 0.95 : successes.length > 0 ? 0.85 : 0.65,\n evidence: [`trajectory:${trajectory.taskId}`],\n tags: Array.from(tags),\n reasoning\n };\n}\n\n/**\n * Executes the complete staged trajectory learning pipeline:\n * trajectory → observations → candidate lessons → reconcile → knowledge\n *\n * Honors the \"Memory should grow by refinement, not accumulation\" principle.\n * Raw trajectory is never dumped directly to knowledge.\n */\nexport function learnFromTrajectory(\n trajectory: TaskTrajectory,\n existingKnowledge: Knowledge[] = [],\n options: { dryRun?: boolean; storage?: { appendMetricEvent(event: any): Promise<void> } } = {}\n): TrajectoryLearningResult {\n const dryRun = options.dryRun ?? false;\n const storage = options.storage;\n const now = new Date().toISOString();\n const taskId = trajectory.taskId || `task_${Date.now()}`;\n const events = trajectory.events || [];\n\n // Step 1: Trajectory -> Observations\n const observations: Observation[] = [];\n events.forEach((event, idx) => {\n let obsType: Provenance['type'] = 'agent';\n let confidence = 0.75;\n const positive: string[] = [taskId, event.type];\n const negative: string[] = [];\n\n if (event.type === 'user_correction') {\n obsType = 'user';\n confidence = 0.98;\n } else if (event.type === 'failure' || event.type === 'revert') {\n obsType = 'test';\n confidence = 0.95;\n negative.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'success') {\n obsType = 'agent';\n confidence = 0.95;\n positive.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'hypothesis') {\n confidence = 0.50; // Inferred / speculative\n }\n\n if (event.path) positive.push(event.path.toLowerCase());\n\n observations.push(\n createObservation({\n source: `trajectory:${taskId}:${event.type}:${idx}`,\n claim: `[${event.type.toUpperCase()}] ${event.description}`,\n provenance: {\n type: obsType,\n path: event.path,\n timestamp: event.timestamp || now\n },\n confidence,\n positive,\n negative: negative.length > 0 ? negative : undefined,\n details: { taskId, eventIndex: idx, eventType: event.type, ...(event.data || {}) }\n })\n );\n });\n\n // Step 2: Observations -> Evidence Nodes\n const evidence: Evidence[] = observations.map((obs) => {\n const isFailure = obs.claim.startsWith('[FAILURE]') || obs.claim.startsWith('[REVERT]');\n return createEvidence(obs, isFailure ? 'contradicts' : 'supports');\n });\n\n // Step 3: Evidence -> Candidate Lessons\n const distilled = distillTrajectory(trajectory);\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n\n if (distilled) {\n // Attach observation IDs as evidence backing\n candidateLessons.push({\n id: distilled.id,\n type: 'lesson',\n statement: distilled.statement,\n positive: distilled.positive,\n negative: distilled.negative,\n confidence: distilled.confidence,\n evidence: evidence.map((e) => e.source),\n tags: distilled.tags,\n scope: 'project'\n });\n }\n\n // Step 4: Candidate Lessons -> Reconcile\n const reconciliations: TrajectoryLearningResult['reconciliations'] = [];\n const currentKnowledgeList = [...existingKnowledge];\n\n for (const candidate of candidateLessons) {\n const recResult = reconcileKnowledge(candidate, currentKnowledgeList);\n\n if (dryRun) {\n reconciliations.push({\n candidate,\n result: recResult,\n action: recResult.action\n });\n } else {\n const { updatedKnowledge, action } = applyReconciliation(\n recResult,\n candidate,\n currentKnowledgeList,\n storage\n );\n reconciliations.push({\n candidate,\n result: recResult,\n appliedKnowledge: updatedKnowledge,\n action\n });\n }\n }\n\n return {\n taskId,\n observations,\n evidence,\n candidateLessons,\n reconciliations,\n dryRun\n };\n}\n\n/**\n * Handle explicit user correction as high-quality evidence.\n * Prevents future agents from repeatedly making the same invalid assumption.\n */\nexport function processUserCorrection(params: {\n topic: string;\n incorrectAssumption: string;\n correctFact: string;\n context?: string[];\n author?: string;\n}): {\n observation: Observation;\n knowledge: Knowledge;\n} {\n const now = new Date().toISOString();\n const prov: Provenance = {\n type: 'user',\n timestamp: now,\n ...(params.author ? { author: params.author } : {})\n };\n\n const claim = `User correction on ${params.topic}: ${params.correctFact} (supersedes assumption: ${params.incorrectAssumption})`;\n\n const observation = createObservation({\n source: `user:correction:${params.topic.toLowerCase()}`,\n claim,\n provenance: prov,\n confidence: 1.0,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()]\n });\n\n const evidence = createEvidence(observation, 'supports');\n\n const knowledge = createKnowledge({\n id: `correction.${params.topic.toLowerCase().replace(/[^a-z0-9_-]/g, '.')}`,\n type: 'rule',\n status: 'active',\n statement: params.correctFact,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()],\n confidence: 1.0,\n confidenceTier: 'high',\n evidence: [evidence.id, observation.source],\n tags: ['user-correction', params.topic.toLowerCase()]\n });\n\n return { observation, knowledge };\n}\n","import type { Knowledge, KnowledgeStatus } from './types.js';\n\nexport interface SourceDependencyIndex {\n // source key (e.g. \"src/auth/session.ts\", \"file:src/auth/session.ts\") -> Set of knowledge IDs\n sourceToKnowledge: Map<string, Set<string>>;\n}\n\nexport function normalizeSourceKey(source: string): string {\n return source.replace(/^(file|code|test|doc):/, '').trim().toLowerCase();\n}\n\n/**\n * Builds a reverse index mapping source paths / files to the knowledge IDs that depend on them.\n */\nexport function buildDependencyIndex(knowledgeList: Knowledge[]): SourceDependencyIndex {\n const sourceToKnowledge = new Map<string, Set<string>>();\n\n for (const k of knowledgeList) {\n const allDependencies = new Set<string>();\n\n // Explicit depends_on\n if (k.depends_on) {\n for (const d of k.depends_on) {\n allDependencies.add(normalizeSourceKey(d));\n }\n }\n\n // Implicit evidence references\n if (k.evidence) {\n for (const ev of k.evidence) {\n allDependencies.add(normalizeSourceKey(ev));\n }\n }\n\n for (const dep of allDependencies) {\n if (!dep) continue;\n let set = sourceToKnowledge.get(dep);\n if (!set) {\n set = new Set<string>();\n sourceToKnowledge.set(dep, set);\n }\n set.add(k.id);\n }\n }\n\n return { sourceToKnowledge };\n}\n\nexport interface StalenessCheckResult {\n knowledgeId: string;\n affected: boolean;\n status: KnowledgeStatus;\n changedSources: string[];\n unchangedSources: string[];\n reason?: string;\n}\n\n/**\n * Checks a knowledge item against a list of changed file paths / sources.\n * If any supporting dependency changed, marks as 'needs_revalidation'.\n */\nexport function checkKnowledgeStaleness(\n knowledge: Knowledge,\n changedSources: string[]\n): StalenessCheckResult {\n const normChanged = new Set(changedSources.map(normalizeSourceKey));\n const allDeps = [\n ...(knowledge.depends_on ?? []).map(normalizeSourceKey),\n ...knowledge.evidence.map(normalizeSourceKey)\n ];\n\n const changed: string[] = [];\n const unchanged: string[] = [];\n\n for (const dep of allDeps) {\n if (!dep) continue;\n // Check direct match or path containment\n const isChanged = normChanged.has(dep) || Array.from(normChanged).some((c) => dep.includes(c) || c.includes(dep));\n if (isChanged) {\n changed.push(dep);\n } else {\n unchanged.push(dep);\n }\n }\n\n if (changed.length > 0) {\n const reason = `Supporting dependency changed: ${changed.join(', ')}. Unchanged evidence: ${unchanged.join(', ') || 'none'}`;\n return {\n knowledgeId: knowledge.id,\n affected: true,\n status: 'needs_revalidation',\n changedSources: changed,\n unchangedSources: unchanged,\n reason\n };\n }\n\n return {\n knowledgeId: knowledge.id,\n affected: false,\n status: knowledge.status,\n changedSources: [],\n unchangedSources: allDeps\n };\n}\n\n/**\n * Marks knowledge units as 'needs_revalidation' when their underlying dependencies change,\n * preserving transparent history and reasons without deleting the knowledge.\n */\nexport function markStaleKnowledge(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): { updatedKnowledge: Knowledge[]; affectedCount: number } {\n const now = new Date().toISOString();\n let affectedCount = 0;\n const updatedKnowledge: Knowledge[] = [];\n\n for (const k of knowledgeList) {\n if (k.status === 'superseded' || k.status === 'invalid' || k.status === 'invalidated') {\n updatedKnowledge.push(k);\n continue;\n }\n\n const res = checkKnowledgeStaleness(k, changedSources);\n if (res.affected) {\n affectedCount++;\n const history = k.history ?? [];\n const updated: Knowledge = {\n ...k,\n status: 'needs_revalidation',\n updatedAt: now,\n history: [\n ...history,\n {\n timestamp: now,\n status: 'needs_revalidation',\n action: 'source_changed',\n reason: res.reason\n }\n ]\n };\n updatedKnowledge.push(updated);\n } else {\n updatedKnowledge.push(k);\n }\n }\n\n return { updatedKnowledge, affectedCount };\n}\n\n/**\n * Checks a list of knowledge units against changed sources and returns the affected items.\n */\nexport function checkKnowledgeListStaleness(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): {\n affectedKnowledge: Knowledge[];\n updatedKnowledge: Knowledge[];\n affectedCount: number;\n} {\n const { updatedKnowledge, affectedCount } = markStaleKnowledge(knowledgeList, changedSources);\n const affectedKnowledge = updatedKnowledge.filter((k) => k.status === 'needs_revalidation');\n return { affectedKnowledge, updatedKnowledge, affectedCount };\n}\n","import type {\n Knowledge,\n JevMatchStatus,\n JevExplanation,\n JevResult,\n Scope\n} from '../core/types.js';\n\nexport interface QueryContext {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n}\n\nconst statementTokenCache = new WeakMap<Knowledge, Set<string>>();\n\nfunction extractTokens(text?: string): Set<string> {\n if (!text) return new Set();\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getKnowledgeStatementTokens(k: Knowledge): Set<string> {\n let tokens = statementTokenCache.get(k);\n if (!tokens) {\n tokens = extractTokens(k.statement);\n statementTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\n/**\n * Evaluates JEV-style positive and negative contextual proximity for a knowledge unit.\n */\nexport function evaluateJev(\n knowledge: Knowledge,\n context: QueryContext\n): JevResult {\n const queryTokens = extractTokens(context.query);\n const contextPos = new Set((context.positive ?? []).map((p) => p.trim().toLowerCase()));\n const contextNeg = new Set((context.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n const knowPos = new Set((knowledge.positive ?? []).map((p) => p.trim().toLowerCase()));\n const knowNeg = new Set((knowledge.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n // 1. Negative Conflict Detection\n const negativeConflicts: string[] = [];\n\n // Knowledge forbids something present in positive context\n for (const n of knowNeg) {\n if (contextPos.has(n) || queryTokens.has(n)) {\n negativeConflicts.push(`Knowledge forbids \"${n}\", which was present in context`);\n }\n }\n\n // Context forbids something present in knowledge\n for (const p of knowPos) {\n if (contextNeg.has(p)) {\n negativeConflicts.push(`Context forbids \"${p}\", which is required by knowledge`);\n }\n }\n\n // 2. Positive Matches\n const positiveMatches: string[] = [];\n\n // Direct cue overlap\n for (const p of knowPos) {\n if (contextPos.has(p)) {\n positiveMatches.push(`Context cue: ${p}`);\n } else {\n // Check if any query token matches or stems into cue\n for (const q of queryTokens) {\n if (p === q || p.startsWith(q) || q.startsWith(p)) {\n positiveMatches.push(`Query term match: ${p}`);\n break;\n }\n }\n }\n }\n\n // Statement query token overlap\n const stmtTokens = getKnowledgeStatementTokens(knowledge);\n let queryOverlapCount = 0;\n for (const q of queryTokens) {\n let matched = false;\n for (const st of stmtTokens) {\n if (q === st || q.startsWith(st) || st.startsWith(q)) {\n matched = true;\n break;\n }\n }\n if (matched) {\n queryOverlapCount++;\n positiveMatches.push(`Statement term: ${q}`);\n }\n }\n\n // 3. Positive Score Calculation\n const totalCues = Math.max(1, knowPos.size);\n const matchedCuesCount = positiveMatches.filter((m) => m.startsWith('Context cue') || m.startsWith('Query term')).length;\n const cueMatchRatio = matchedCuesCount / totalCues;\n const tokenOverlapScore = queryTokens.size > 0 ? queryOverlapCount / Math.max(1, queryTokens.size) : 0;\n const rawPositiveScore = 0.65 * cueMatchRatio + 0.35 * tokenOverlapScore;\n\n // 4. Scope Alignment\n let scopeMultiplier = 1.0;\n const targetScope = (context.scope ?? 'project').toLowerCase();\n const knowScope = (knowledge.scope ?? 'project').toLowerCase();\n\n if (targetScope === knowScope) {\n scopeMultiplier = 1.0;\n } else if (knowScope === 'global' || targetScope.startsWith(knowScope)) {\n scopeMultiplier = 0.85;\n } else if (knowScope === 'project' && targetScope.startsWith('branch:')) {\n scopeMultiplier = 0.90;\n } else {\n // Mismatched scopes\n scopeMultiplier = 0.30;\n }\n\n // 5. Confidence and Evidence Ratio\n const m = knowledge.metrics;\n const evRatio = (m.support_count + 1) / (m.support_count + 2 * m.contradiction_count + 1);\n const confidenceFactor = knowledge.confidence * evRatio;\n\n // 6. Outcome Boost / Penalty\n let outcomeAdjustment = 0;\n if (m.successful_outcomes > 0) {\n outcomeAdjustment += Math.min(0.10, m.successful_outcomes * 0.03);\n }\n if (m.failed_outcomes > 0) {\n outcomeAdjustment -= Math.min(0.20, m.failed_outcomes * 0.05);\n }\n\n // 7. Base Combined Score\n let score = (rawPositiveScore * 0.45 + confidenceFactor * 0.40 + outcomeAdjustment) * scopeMultiplier;\n\n // Stale or Contradicted Status Penalty\n if (knowledge.status === 'stale') {\n score *= 0.6;\n } else if (knowledge.status === 'contradicted') {\n score *= 0.3;\n } else if (knowledge.status === 'invalid' || knowledge.status === 'superseded') {\n score *= 0.1;\n }\n\n // 8. Negative Conflict Penalty & Decision\n let status: JevMatchStatus = 'POSSIBLE';\n const reasons: string[] = [];\n\n if (negativeConflicts.length > 0) {\n // Severe penalty for negative conflicts\n score = Math.max(0.01, score * 0.2);\n status = 'REJECT';\n reasons.push(`Rejected due to ${negativeConflicts.length} negative contextual conflicts.`);\n } else if (score >= 0.45 && positiveMatches.length > 0) {\n status = 'MATCH';\n reasons.push(`Strong contextual match with ${positiveMatches.length} matching signals.`);\n } else if (score >= 0.25) {\n status = 'POSSIBLE';\n reasons.push(`Potential match; partial contextual overlap.`);\n } else {\n status = 'REJECT';\n reasons.push(`Insufficient contextual match score (${score.toFixed(2)} < 0.25).`);\n }\n\n const finalScore = Math.round(Math.min(1.0, Math.max(0.0, score)) * 100) / 100;\n\n const explanation: JevExplanation = {\n positiveMatches,\n negativeConflicts,\n score: finalScore,\n confidence: knowledge.confidence,\n status,\n reasons\n };\n\n return {\n knowledge,\n status,\n score: finalScore,\n explanation\n };\n}\n","import type { Knowledge, JevResult } from '../core/types.js';\nimport { evaluateJev, type QueryContext } from './scorer.js';\n\n/**\n * Re-ranks a small set of candidate knowledge units using JEV contextual evaluation.\n */\nexport function rerankCandidates(\n candidates: Knowledge[],\n context: QueryContext\n): JevResult[] {\n const results: JevResult[] = [];\n\n for (const candidate of candidates) {\n const res = evaluateJev(candidate, context);\n results.push(res);\n }\n\n // Sort: MATCH first, then POSSIBLE, then REJECT; within each group, highest score first\n const statusPriority: Record<string, number> = {\n MATCH: 3,\n POSSIBLE: 2,\n REJECT: 1\n };\n\n results.sort((a, b) => {\n const prioDiff = (statusPriority[b.status] ?? 0) - (statusPriority[a.status] ?? 0);\n if (prioDiff !== 0) return prioDiff;\n const scoreDiff = b.score - a.score;\n if (Math.abs(scoreDiff) > 0.001) return scoreDiff;\n return b.knowledge.confidence - a.knowledge.confidence;\n });\n\n return results;\n}\n","import { create, insert, remove, search, type AnyOrama } from '@orama/orama';\nimport type { Knowledge } from '../core/types.js';\n\n/**\n * Rebuildable in-memory search index powered by Orama.\n * Note: Orama is strictly a candidate retrieval cache, NEVER the canonical source of truth.\n */\nexport class SearchIndex {\n private db: AnyOrama | null = null;\n private idToDocId = new Map<string, string>();\n\n async init(): Promise<void> {\n this.db = await create({\n schema: {\n id: 'string',\n statement: 'string',\n type: 'string',\n scope: 'string',\n status: 'string',\n positive: 'string[]',\n negative: 'string[]',\n tags: 'string[]'\n }\n });\n this.idToDocId.clear();\n }\n\n async buildIndex(knowledgeList: Knowledge[]): Promise<void> {\n await this.init();\n for (const item of knowledgeList) {\n await this.upsert(item);\n }\n }\n\n async upsert(item: Knowledge): Promise<void> {\n if (!this.db) {\n await this.init();\n }\n\n // If already in index, remove first\n const existingDocId = this.idToDocId.get(item.id);\n if (existingDocId) {\n try {\n await remove(this.db!, existingDocId);\n } catch {\n // Ignore if already deleted\n }\n this.idToDocId.delete(item.id);\n }\n\n const docId = await insert(this.db!, {\n id: item.id,\n statement: item.statement,\n type: item.type,\n scope: item.scope,\n status: item.status,\n positive: item.positive,\n negative: item.negative,\n tags: item.tags ?? []\n });\n\n this.idToDocId.set(item.id, docId);\n }\n\n async delete(id: string): Promise<void> {\n if (!this.db) return;\n const docId = this.idToDocId.get(id);\n if (docId) {\n try {\n await remove(this.db, docId);\n } catch {\n // Ignore\n }\n this.idToDocId.delete(id);\n }\n }\n\n async searchCandidates(term: string, limit = 25): Promise<string[]> {\n if (!this.db) {\n return [];\n }\n\n const cleanTerm = term.trim();\n if (!cleanTerm) {\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n\n try {\n const results = await search(this.db, {\n term: cleanTerm,\n limit,\n threshold: 0.2\n });\n\n return results.hits.map((h) => (h.document as any).id as string);\n } catch {\n // Fallback: term might contain special characters or fail tokenization\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n }\n\n size(): number {\n return this.idToDocId.size;\n }\n}\n\nexport { SearchIndex as OramaIndex };\n\n","import type { Knowledge, JevResult, Scope } from '../core/types.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport type { QueryContext } from '../jev/scorer.js';\nimport type { SearchIndex } from './indexer.js';\n\nexport interface LookupOptions {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n limit?: number;\n includeRejected?: boolean;\n}\n\nexport interface KnowledgeStoreProvider {\n getKnowledge(id: string): Promise<Knowledge | undefined>;\n getAllKnowledge(): Promise<Knowledge[]>;\n}\n\nexport class Retriever {\n constructor(\n private index: SearchIndex,\n private store: KnowledgeStoreProvider\n ) {}\n\n /**\n * Executes the full Bilmem retrieval pipeline:\n * 1. Query / Context\n * 2. Candidate retrieval (small candidate set)\n * 3. JEV contextual reranking\n * 4. MATCH / POSSIBLE / REJECT classification with explanations\n */\n async lookup(options: LookupOptions = {}): Promise<JevResult[]> {\n const limit = options.limit ?? 5;\n const query = options.query?.trim() ?? '';\n const positive = options.positive ?? [];\n const negative = options.negative ?? [];\n const scope = options.scope ?? 'project';\n\n const searchTerms: string[] = [];\n if (query) searchTerms.push(query);\n if (positive.length > 0) searchTerms.push(...positive.slice(0, 3));\n\n const searchTerm = searchTerms.join(' ').trim();\n\n // 1. Retrieve Candidate IDs from Orama\n let candidateIds = await this.index.searchCandidates(searchTerm, 30);\n\n // If no candidate found via search or empty term, get active items from store\n let candidates: Knowledge[] = [];\n if (candidateIds.length === 0) {\n const all = await this.store.getAllKnowledge();\n candidates = all.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const id of candidateIds) {\n const item = await this.store.getKnowledge(id);\n if (item && item.status !== 'invalid' && item.status !== 'superseded') {\n candidates.push(item);\n }\n }\n\n // If candidates are very few (< 5), broaden candidate pool with active knowledge\n if (candidates.length < 5) {\n const all = await this.store.getAllKnowledge();\n for (const k of all) {\n if (!candidateIds.includes(k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n candidates.push(k);\n if (candidates.length >= 20) break;\n }\n }\n }\n }\n\n // 2. JEV Reranking on Candidates\n const queryContext: QueryContext = {\n query,\n positive,\n negative,\n scope\n };\n\n const reranked = rerankCandidates(candidates, queryContext);\n\n // 3. Filter by includeRejected and limit\n const filtered = options.includeRejected\n ? reranked\n : reranked.filter((r) => r.status !== 'REJECT');\n\n return filtered.slice(0, limit);\n }\n}\n\nexport { Retriever as BilmemRetriever };\n\n","import type {\n Knowledge,\n InvestigationReceipt,\n ResolutionResult,\n ResolutionState,\n ResolutionReason,\n ResolveOptions,\n NextEvidenceAction,\n ActionType,\n Scope,\n JevResult\n} from './types.js';\nimport { rerankCandidates } from '../jev/index.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport type { Storage } from '../storage/canonical.js';\n\n/**\n * Relative cost table for evidence-gathering actions.\n * Smallest action likely to resolve uncertainty is preferred.\n */\nexport const RELATIVE_COSTS: Record<ActionType, number> = {\n USE_KNOWLEDGE: 1,\n INSPECT_TEST: 2,\n INSPECT_FILE: 2,\n INSPECT_SYMBOL: 2.5,\n CHECK_DOCUMENTATION: 2.5,\n CHECK_GIT: 3,\n SEARCH_REPOSITORY: 4,\n ASK_USER: 3.5, // Context-dependent; cheaper than broad scan when specifically targeted\n STOP: 1\n};\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n/**\n * Core Epistemic Resolver:\n * Answers: \"Do I know enough to act, what do I know does not apply,\n * what am I missing, and what is the cheapest next step to resolve the uncertainty?\"\n */\nexport async function resolveEpistemicQuery(\n options: ResolveOptions,\n storage: Storage,\n retriever?: Retriever | SearchIndex\n): Promise<ResolutionResult> {\n const question = options.question.trim();\n const positive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Context Extraction: extract keywords from the question + explicit cues\n const queryTokens = tokenize(question);\n const contextualCues = Array.from(new Set([...positive, ...queryTokens]));\n\n // 2. Candidate Retrieval & 3. JEV Applicability Filtering\n const allKnowledge = await storage.getAllKnowledge();\n let jevResults: JevResult[];\n\n if (retriever instanceof Retriever) {\n jevResults = await retriever.lookup({\n query: question,\n positive: options.positive,\n negative: options.negative,\n scope,\n limit: options.limit ?? 25,\n includeRejected: true\n });\n } else {\n let candidatePool: Knowledge[] = [];\n if (retriever instanceof SearchIndex) {\n const queryTerm = queryTokens.slice(0, 5).join(' ');\n const ids = await retriever.searchCandidates(queryTerm, 30);\n for (const id of ids) {\n const item = await storage.getKnowledge(id);\n if (item) candidatePool.push(item);\n }\n }\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge;\n }\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.positive.some((p) => contextualCues.includes(p))) {\n candidatePool.push(k);\n }\n }\n jevResults = rerankCandidates(candidatePool, {\n positive: options.positive,\n negative: options.negative,\n scope\n });\n }\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n let jevReason = 'INSUFFICIENT_CONTEXT';\n if (res.explanation.negativeConflicts.length > 0) {\n jevReason = 'HARD_NEGATIVE';\n } else if (res.explanation.reasons.some((r) => r.toLowerCase().includes('scope'))) {\n jevReason = 'SCOPE_MISMATCH';\n } else if (res.knowledge.status === 'stale' || res.knowledge.status === 'needs_revalidation') {\n jevReason = 'STALE_KNOWLEDGE';\n }\n\n await storage.appendMetricEvent({\n type: 'jev_result',\n knowledgeId: res.knowledge.id,\n result: res.status,\n reason: jevReason,\n timestamp: Date.now()\n });\n\n if (jevReason === 'HARD_NEGATIVE') {\n await storage.appendMetricEvent({\n type: 'jev_hard_negative',\n knowledgeId: res.knowledge.id,\n timestamp: Date.now()\n });\n }\n\n if (res.status === 'REJECT') {\n const conflictMsg = res.explanation.negativeConflicts.length > 0\n ? `${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({\n id: res.knowledge.id,\n reason: conflictMsg\n });\n } else if (res.status === 'MATCH' || res.status === 'POSSIBLE') {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 4. Retrieve Past Investigation Receipts to Avoid Redundant Work\n const receipts = await storage.getAllReceipts();\n const previouslyChecked = new Set<string>();\n const previouslyRejectedTargets = new Map<string, string>();\n\n // Find receipts relating to this question or overlapping context\n for (const r of receipts) {\n const qOverlap = tokenize(r.question).filter((t) => queryTokens.includes(t));\n if (qOverlap.length >= 2 || (r.positive && r.positive.some((p) => contextualCues.includes(p)))) {\n await storage.appendMetricEvent({\n type: 'investigation_reused',\n investigationId: r.id,\n timestamp: Date.now()\n });\n for (const c of r.checked) {\n previouslyChecked.add(c);\n }\n for (const rej of r.rejected) {\n previouslyRejectedTargets.set(rej.target, rej.reason);\n }\n }\n }\n\n // Add paths from existing evidence of matching items to checked list\n for (const m of matchingItems) {\n for (const ev of m.evidence) {\n previouslyChecked.add(ev.replace(/^(code|file|test|doc):/, ''));\n }\n if (m.depends_on) {\n for (const dep of m.depends_on) {\n previouslyChecked.add(dep.replace(/^(code|file|test|doc):/, ''));\n }\n }\n }\n\n // 5. Evidence & Staleness Evaluation\n const staleCandidates = matchingItems.filter((k) => k.status === 'needs_revalidation' || k.status === 'stale');\n const contradictedCandidates = matchingItems.filter((k) => k.status === 'contradicted');\n const activeCandidates = matchingItems.filter(\n (k) =>\n (k.status === 'active' || k.stage === 'active' || k.stage === 'probation') &&\n k.status !== 'needs_revalidation' &&\n k.status !== 'stale' &&\n k.status !== 'contradicted' &&\n k.status !== 'invalid' &&\n k.status !== 'superseded'\n );\n\n // 6. Question Memory: Check if a learned QUESTION exists for this uncertainty pattern\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n let learnedQuestionToAsk: { question: string; targetTopic: string; reason: string } | undefined;\n\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualCues.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n learnedQuestionToAsk = {\n question: qk.question,\n targetTopic: qk.resolves?.[0] || 'uncertainty',\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`\n };\n break;\n }\n }\n\n // 7. Missing Aspects / Gap Analysis\n const coveredTokens = new Set<string>();\n for (const k of activeCandidates) {\n for (const t of tokenize(k.statement)) coveredTokens.add(t);\n for (const p of k.positive) coveredTokens.add(p);\n }\n\n const missingAspects: string[] = [];\n for (const qt of queryTokens) {\n if (!['how', 'what', 'why', 'when', 'where', 'are', 'the', 'for', 'with', 'does', 'from'].includes(qt)) {\n if (!coveredTokens.has(qt)) {\n missingAspects.push(qt);\n }\n }\n }\n\n // 8. Determine Resolution State\n let state: ResolutionState = 'UNKNOWN';\n let reason: ResolutionReason | undefined;\n\n if (activeCandidates.length === 0 && staleCandidates.length > 0) {\n state = 'STALE';\n reason = 'STALE_EVIDENCE';\n } else if (activeCandidates.length === 0 && contradictedCandidates.length > 0) {\n state = 'CONFLICTED';\n reason = 'CONFLICTING_EVIDENCE';\n } else if (activeCandidates.length === 0) {\n state = 'UNKNOWN';\n reason = rejectedItems.length > 0 && matchingItems.length === 0 ? 'CONTEXT_MISMATCH' : 'NOT_OBSERVED';\n } else if (missingAspects.length === 0 && activeCandidates.some((k) => k.confidence >= 0.85)) {\n state = 'KNOWN';\n } else {\n state = 'PARTIALLY_KNOWN';\n reason = 'INSUFFICIENT_EVIDENCE';\n }\n\n // 9. Deterministic Next Evidence Action Planner\n const checkedArray = Array.from(previouslyChecked);\n let nextAction: NextEvidenceAction | undefined;\n let fallback: ResolutionResult['fallback'];\n\n if (state === 'KNOWN') {\n nextAction = {\n type: 'USE_KNOWLEDGE',\n target: activeCandidates[0].id,\n reason: `Sufficient high-confidence knowledge available (${activeCandidates[0].id})`,\n relativeCost: RELATIVE_COSTS.USE_KNOWLEDGE,\n expectedInfoGain: 0.95\n };\n } else if (state === 'CONFLICTED') {\n nextAction = {\n type: 'ASK_USER',\n reason: 'Opposing credible knowledge requires contextual disambiguation',\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: `Conflicting conventions exist for \"${question}\". Which context applies?`\n };\n } else if (state === 'STALE') {\n const staleItem = staleCandidates[0];\n const targetSource = staleItem.depends_on?.[0] || staleItem.evidence[0] || 'source';\n nextAction = {\n type: 'INSPECT_FILE',\n target: targetSource.replace(/^(code|file|test|doc):/, ''),\n reason: `Revalidate stale knowledge (${staleItem.id}) whose dependencies changed`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.85\n };\n } else {\n // PARTIALLY_KNOWN or UNKNOWN: find cheapest untried action\n // Candidate actions ranked by expected information gain / relative cost\n\n // Priority 1: Learned Question from Question Memory (if high expected value)\n if (learnedQuestionToAsk) {\n nextAction = {\n type: 'ASK_USER',\n reason: learnedQuestionToAsk.reason,\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: learnedQuestionToAsk.question\n };\n } else {\n // Priority 2: Check candidate test or file evidence not yet inspected\n const testCandidates = [\n `tests/${queryTokens[0] || 'module'}.test.ts`,\n `test/${queryTokens[0] || 'module'}.test.ts`,\n `tests/session-refresh.test.ts`\n ];\n\n const uninspectedTest = testCandidates.find(\n (t) => !previouslyChecked.has(t) && !previouslyRejectedTargets.has(t)\n );\n\n const fileCandidates = [\n `src/${queryTokens[0] || 'auth'}/${queryTokens[1] || 'index'}.ts`,\n `src/${queryTokens[0] || 'index'}.ts`\n ];\n\n const uninspectedFile = fileCandidates.find(\n (f) => !previouslyChecked.has(f) && !previouslyRejectedTargets.has(f)\n );\n\n for (const t of testCandidates) {\n if (previouslyChecked.has(t)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: t,\n timestamp: Date.now()\n });\n }\n }\n for (const f of fileCandidates) {\n if (previouslyChecked.has(f)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: f,\n timestamp: Date.now()\n });\n }\n }\n\n if (uninspectedTest && missingAspects.some((m) => m.includes('order') || m.includes('test') || m.includes('behavior'))) {\n nextAction = {\n type: 'INSPECT_TEST',\n target: uninspectedTest,\n reason: `Targeted test inspection for unconfirmed aspect: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_TEST,\n expectedInfoGain: 0.8\n };\n } else if (uninspectedFile) {\n nextAction = {\n type: 'INSPECT_FILE',\n target: uninspectedFile,\n reason: `Direct source inspection for missing context: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.75\n };\n } else {\n // Fallback to targeted symbol/repository search\n nextAction = {\n type: 'SEARCH_REPOSITORY',\n target: missingAspects.slice(0, 3).join(' ') || question,\n reason: `Targeted search for unobserved aspects: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.SEARCH_REPOSITORY,\n expectedInfoGain: 0.6\n };\n }\n\n fallback = {\n type: 'ask',\n question: `Could you clarify: ${question}? (Missing: ${missingAspects.join(', ') || 'specifics'})`\n };\n }\n }\n\n // Record Metric Events\n if (state === 'KNOWN' || (nextAction && nextAction.type !== 'SEARCH_REPOSITORY' && nextAction.type !== 'STOP')) {\n await storage.appendMetricEvent({\n type: 'broad_search_avoided',\n targetAction: nextAction?.type,\n timestamp: Date.now()\n });\n }\n\n for (const k of activeCandidates) {\n await storage.appendMetricEvent({\n type: 'knowledge_reused',\n knowledgeId: k.id,\n timestamp: Date.now()\n });\n }\n\n if (learnedQuestionToAsk || fallback?.type === 'ask') {\n await storage.appendMetricEvent({\n type: 'question_suggested',\n question: learnedQuestionToAsk?.question || fallback?.question,\n timestamp: Date.now()\n });\n }\n\n await storage.appendMetricEvent({\n type: 'resolve',\n state,\n action: nextAction?.type,\n question,\n timestamp: Date.now()\n });\n\n // 10. Record Investigation Receipt\n const receiptId = `receipt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const receipt: InvestigationReceipt = {\n id: receiptId,\n question,\n checked: checkedArray,\n findings: activeCandidates.map((c) => c.statement),\n rejected: rejectedItems.map((r) => ({ target: r.id, reason: r.reason })),\n missing: missingAspects,\n next: nextAction,\n status: state === 'KNOWN' ? 'resolved' : 'unresolved',\n timestamp: new Date().toISOString(),\n positive,\n negative\n };\n\n await storage.saveReceipt(receipt);\n\n return {\n state,\n reason,\n known: activeCandidates.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier ?? k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n })),\n applicable: positive.length > 0 ? positive : contextualCues.slice(0, 5),\n rejected: rejectedItems,\n missing: missingAspects,\n checked: checkedArray,\n next: nextAction,\n fallback,\n receiptId\n };\n}\n"],"mappings":"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","names":["createHash","createHash","m","tokenize"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/relations.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/core/unknown.ts","../../src/core/outcome.ts","../../src/core/learn.ts","../../src/core/dependencies.ts","../../src/jev/scorer.ts","../../src/jev/matcher.ts","../../src/search/indexer.ts","../../src/search/retriever.ts","../../src/core/resolver.ts","../../src/core/preflight.ts"],"sourcesContent":["import type { EvidenceRelation, RelationType } from './types.js';\n\n/**\n * Lightweight, in-memory graph structure for managing relations between\n * files, observations, evidence, and knowledge nodes.\n */\nexport class EvidenceGraph {\n private fromMap = new Map<string, EvidenceRelation[]>();\n private toMap = new Map<string, EvidenceRelation[]>();\n\n constructor(relations: EvidenceRelation[] = []) {\n for (const rel of relations) {\n this.addRelation(rel);\n }\n }\n\n addRelation(relation: EvidenceRelation): void {\n if (!relation || !relation.from || !relation.to || !relation.type) {\n return;\n }\n\n // Prevent identical duplicate edges\n const existing = this.getRelationsBetween(relation.from, relation.to);\n const dup = existing.find((r) => r.type === relation.type);\n if (dup) {\n // If weight differs, increase weight\n dup.weight = (dup.weight ?? 1) + (relation.weight ?? 1);\n return;\n }\n\n const fromList = this.fromMap.get(relation.from) ?? [];\n fromList.push(relation);\n this.fromMap.set(relation.from, fromList);\n\n const toList = this.toMap.get(relation.to) ?? [];\n toList.push(relation);\n this.toMap.set(relation.to, toList);\n }\n\n getRelationsFrom(fromId: string): EvidenceRelation[] {\n return this.fromMap.get(fromId) ?? [];\n }\n\n getRelationsTo(toId: string): EvidenceRelation[] {\n return this.toMap.get(toId) ?? [];\n }\n\n getRelationsBetween(fromId: string, toId: string): EvidenceRelation[] {\n const fromList = this.fromMap.get(fromId);\n if (!fromList) return [];\n return fromList.filter((r) => r.to === toId);\n }\n\n getAllRelations(): EvidenceRelation[] {\n const all: EvidenceRelation[] = [];\n for (const list of this.fromMap.values()) {\n all.push(...list);\n }\n return all;\n }\n\n findCoChanged(file: string, threshold = 1): Array<{ file: string; weight: number }> {\n const relations = this.getRelationsFrom(file).filter((r) => r.type === 'CO_CHANGED');\n const result: Array<{ file: string; weight: number }> = [];\n\n for (const rel of relations) {\n const w = rel.weight ?? 1;\n if (w >= threshold) {\n result.push({ file: rel.to, weight: w });\n }\n }\n\n return result.sort((a, b) => b.weight - a.weight);\n }\n\n findConnected(id: string, maxDepth = 2): string[] {\n const visited = new Set<string>();\n const queue: Array<{ node: string; depth: number }> = [{ node: id, depth: 0 }];\n\n while (queue.length > 0) {\n const { node, depth } = queue.shift()!;\n if (visited.has(node)) continue;\n visited.add(node);\n\n if (depth < maxDepth) {\n const outRels = this.getRelationsFrom(node);\n for (const r of outRels) {\n if (!visited.has(r.to)) {\n queue.push({ node: r.to, depth: depth + 1 });\n }\n }\n const inRels = this.getRelationsTo(node);\n for (const r of inRels) {\n if (!visited.has(r.from)) {\n queue.push({ node: r.from, depth: depth + 1 });\n }\n }\n }\n }\n\n visited.delete(id);\n return Array.from(visited);\n }\n\n toJSON(): EvidenceRelation[] {\n return this.getAllRelations();\n }\n\n static fromJSON(relations: EvidenceRelation[]): EvidenceGraph {\n return new EvidenceGraph(relations);\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement?: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n lesson?: string;\n failure_details?: Record<string, unknown>;\n context?: Record<string, unknown>;\n contradicts?: string[];\n blocking?: boolean;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: (params.statement ?? params.question ?? params.id).trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n lesson: params.lesson,\n failure_details: params.failure_details,\n context: params.context,\n contradicts: params.contradicts ? Array.from(new Set(params.contradicts)) : undefined,\n blocking: params.blocking,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type {\n UnknownRecord,\n UnknownState,\n UnknownReason,\n UnknownNextAction,\n Scope\n} from './types.js';\n\nexport function createUnknown(params: {\n id: string;\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n checked?: string[];\n next?: UnknownNextAction;\n scope?: Scope;\n}): UnknownRecord {\n const now = new Date().toISOString();\n return {\n id: params.id.trim(),\n state: params.state ?? 'UNKNOWN',\n reason: params.reason ?? 'NOT_OBSERVED',\n statement: params.statement?.trim(),\n checked: Array.from(new Set(params.checked?.map((c) => c.trim()) ?? [])),\n next: params.next,\n scope: params.scope ?? 'project',\n createdAt: now,\n updatedAt: now\n };\n}\n\n/**\n * Checks if a specific path or query was already investigated,\n * helping agents avoid repeating useless investigations.\n */\nexport function hasBeenInvestigated(\n unknowns: UnknownRecord[],\n target: string\n): { investigated: boolean; record?: UnknownRecord; reason?: string } {\n const normalizedTarget = target.trim().toLowerCase();\n\n for (const record of unknowns) {\n if (record.id.toLowerCase() === normalizedTarget) {\n return { investigated: true, record, reason: record.reason };\n }\n\n const checkedMatch = record.checked.some((c) => {\n const nc = c.toLowerCase();\n return nc === normalizedTarget || normalizedTarget.startsWith(nc.replace('/**', ''));\n });\n\n if (checkedMatch) {\n return { investigated: true, record, reason: record.reason };\n }\n }\n\n return { investigated: false };\n}\n\n/**\n * Update an existing unknown with new checked paths or update its state when partially known or resolved.\n */\nexport function updateUnknown(\n record: UnknownRecord,\n updates: {\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n addChecked?: string[];\n next?: UnknownNextAction;\n }\n): UnknownRecord {\n const checked = new Set(record.checked);\n if (updates.addChecked) {\n for (const c of updates.addChecked) {\n checked.add(c.trim());\n }\n }\n\n return {\n ...record,\n state: updates.state ?? record.state,\n reason: updates.reason ?? record.reason,\n statement: updates.statement !== undefined ? updates.statement : record.statement,\n checked: Array.from(checked),\n next: updates.next !== undefined ? updates.next : record.next,\n updatedAt: new Date().toISOString()\n };\n}\n","import { hashString, calculateEffectiveConfidence } from './knowledge.js';\nimport type {\n OutcomeRecord,\n OutcomeType,\n Knowledge,\n BilmemMetrics\n} from './types.js';\n\nexport function createOutcome(params: {\n knowledgeId?: string;\n taskId?: string;\n result: OutcomeType;\n context?: {\n positive?: string[];\n negative?: string[];\n };\n feedback?: string;\n}): OutcomeRecord {\n const content = `${params.knowledgeId || 'none'}:${params.result}:${Date.now()}`;\n return {\n id: `out_${hashString(content)}`,\n knowledgeId: params.knowledgeId,\n taskId: params.taskId,\n result: params.result,\n context: params.context,\n feedback: params.feedback,\n timestamp: new Date().toISOString()\n };\n}\n\n/**\n * Apply outcome to a knowledge unit and recalculate its confidence.\n */\nexport function applyOutcomeToKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): Knowledge {\n const now = new Date().toISOString();\n knowledge.metrics.reuse_count++;\n knowledge.metrics.last_used = now;\n\n if (outcome.result === 'success') {\n knowledge.metrics.successful_outcomes++;\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n knowledge.metrics.failed_outcomes++;\n }\n\n // Recalculate effective confidence\n knowledge.confidence = calculateEffectiveConfidence(knowledge);\n knowledge.updatedAt = now;\n return knowledge;\n}\n\nexport class MetricsTracker {\n private metrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n\n constructor(initial?: Partial<BilmemMetrics>) {\n if (initial) {\n this.metrics = { ...this.metrics, ...initial };\n }\n }\n\n recordHit(): void {\n this.metrics.knowledgeHits++;\n }\n\n recordMiss(): void {\n this.metrics.knowledgeMisses++;\n }\n\n recordReused(): void {\n this.metrics.knowledgeReused++;\n }\n\n recordUnknownResolved(): void {\n this.metrics.unknownsResolved++;\n }\n\n recordInvestigationPrevented(): void {\n this.metrics.repeatedInvestigationsPrevented++;\n }\n\n recordCandidateMerged(): void {\n this.metrics.candidateKnowledgeMerged++;\n }\n\n recordStaleDetected(): void {\n this.metrics.staleKnowledgeDetected++;\n }\n\n recordContradiction(): void {\n this.metrics.contradictionsDetected++;\n }\n\n recordPromoted(): void {\n this.metrics.knowledgePromoted++;\n }\n\n recordSuperseded(): void {\n this.metrics.knowledgeSuperseded++;\n }\n\n getMetrics(): BilmemMetrics {\n return { ...this.metrics };\n }\n\n toJSON(): BilmemMetrics {\n return this.metrics;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n TaskTrajectory,\n Knowledge,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction\n} from './types.js';\nimport {\n createObservation,\n createEvidence,\n createKnowledge,\n reconcileKnowledge,\n applyReconciliation\n} from './knowledge.js';\n\nexport interface DistilledLesson {\n id: string;\n statement: string;\n positive: string[];\n negative: string[];\n confidence: number;\n evidence: string[];\n tags: string[];\n reasoning: string;\n}\n\nexport interface TrajectoryLearningResult {\n taskId: string;\n observations: Observation[];\n evidence: Evidence[];\n candidateLessons: Array<Partial<Knowledge> & { statement: string }>;\n reconciliations: Array<{\n candidate: Partial<Knowledge> & { statement: string };\n result: ReconciliationResult;\n appliedKnowledge?: Knowledge;\n action: ReconciliationAction;\n }>;\n dryRun: boolean;\n}\n\n/**\n * Distill a task trajectory into a compact, reusable candidate lesson.\n * Avoids dumping raw trajectories into permanent memory;\n * extracts only the crystallized insight (what worked, what failed, negative patterns).\n */\nexport function distillTrajectory(trajectory: TaskTrajectory): DistilledLesson | null {\n const events = trajectory.events || [];\n if (events.length === 0) return null;\n\n const failures = events.filter((e) => e.type === 'failure' || e.type === 'revert');\n const successes = events.filter((e) => e.type === 'success');\n const corrections = events.filter((e) => e.type === 'user_correction');\n\n // If nothing succeeded or no significant signal, do not create spurious memory\n if (successes.length === 0 && corrections.length === 0 && failures.length === 0) {\n return null;\n }\n\n const positiveSignals = new Set<string>();\n const negativeSignals = new Set<string>();\n const tags = new Set<string>(['lesson', 'trajectory']);\n\n // Extract negative signals from failures and rejected hypotheses\n for (const f of failures) {\n negativeSignals.add(f.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (f.path) negativeSignals.add(f.path.toLowerCase());\n }\n\n // Extract positive signals from successful attempts & goal\n for (const s of successes) {\n positiveSignals.add(s.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (s.path) positiveSignals.add(s.path.toLowerCase());\n }\n\n // Extract from user corrections\n for (const c of corrections) {\n positiveSignals.add(c.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n tags.add('user-correction');\n }\n\n // Extract tokens from goal\n const goalTokens = trajectory.goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const t of goalTokens) {\n positiveSignals.add(t);\n }\n\n // Compose statement\n let statement = '';\n let reasoning = '';\n\n if (corrections.length > 0) {\n const lastCorr = corrections[corrections.length - 1];\n statement = `Corrected approach for \"${trajectory.goal}\": ${lastCorr.description}`;\n reasoning = `Based on user correction during task ${trajectory.taskId}`;\n } else if (successes.length > 0) {\n const lastSuccess = successes[successes.length - 1];\n if (failures.length > 0) {\n const firstFailure = failures[0];\n statement = `When addressing \"${trajectory.goal}\": prefer ${lastSuccess.description} over ${firstFailure.description}`;\n reasoning = `Initial attempt (${firstFailure.description}) failed/reverted; resolved by ${lastSuccess.description}`;\n } else {\n statement = `Effective pattern for \"${trajectory.goal}\": ${lastSuccess.description}`;\n reasoning = `Directly succeeded in task ${trajectory.taskId}`;\n }\n } else if (failures.length > 0) {\n const failureList = failures.map((f) => f.description).join(', ');\n statement = `Avoid for \"${trajectory.goal}\": approaches [${failureList}] failed`;\n reasoning = `Recorded ${failures.length} failed attempts in task ${trajectory.taskId}`;\n }\n\n const hash = createHash('sha256')\n .update(`${trajectory.goal}:${statement}`)\n .digest('hex')\n .slice(0, 12);\n const id = `lesson.${trajectory.taskId || hash}`;\n\n return {\n id,\n statement,\n positive: Array.from(positiveSignals).slice(0, 8),\n negative: Array.from(negativeSignals).slice(0, 8),\n confidence: corrections.length > 0 ? 0.95 : successes.length > 0 ? 0.85 : 0.65,\n evidence: [`trajectory:${trajectory.taskId}`],\n tags: Array.from(tags),\n reasoning\n };\n}\n\n/**\n * Executes the complete staged trajectory learning pipeline:\n * trajectory → observations → candidate lessons → reconcile → knowledge\n *\n * Honors the \"Memory should grow by refinement, not accumulation\" principle.\n * Raw trajectory is never dumped directly to knowledge.\n */\nexport function learnFromTrajectory(\n trajectory: TaskTrajectory,\n existingKnowledge: Knowledge[] = [],\n options: { dryRun?: boolean; storage?: { appendMetricEvent(event: any): Promise<void> } } = {}\n): TrajectoryLearningResult {\n const dryRun = options.dryRun ?? false;\n const storage = options.storage;\n const now = new Date().toISOString();\n const taskId = trajectory.taskId || `task_${Date.now()}`;\n const events = trajectory.events || [];\n\n // Step 1: Trajectory -> Observations\n const observations: Observation[] = [];\n events.forEach((event, idx) => {\n let obsType: Provenance['type'] = 'agent';\n let confidence = 0.75;\n const positive: string[] = [taskId, event.type];\n const negative: string[] = [];\n\n if (event.type === 'user_correction') {\n obsType = 'user';\n confidence = 0.98;\n } else if (event.type === 'failure' || event.type === 'revert') {\n obsType = 'test';\n confidence = 0.95;\n negative.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'success') {\n obsType = 'agent';\n confidence = 0.95;\n positive.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'hypothesis') {\n confidence = 0.50; // Inferred / speculative\n }\n\n if (event.path) positive.push(event.path.toLowerCase());\n\n observations.push(\n createObservation({\n source: `trajectory:${taskId}:${event.type}:${idx}`,\n claim: `[${event.type.toUpperCase()}] ${event.description}`,\n provenance: {\n type: obsType,\n path: event.path,\n timestamp: event.timestamp || now\n },\n confidence,\n positive,\n negative: negative.length > 0 ? negative : undefined,\n details: { taskId, eventIndex: idx, eventType: event.type, ...(event.data || {}) }\n })\n );\n });\n\n // Step 2: Observations -> Evidence Nodes\n const evidence: Evidence[] = observations.map((obs) => {\n const isFailure = obs.claim.startsWith('[FAILURE]') || obs.claim.startsWith('[REVERT]');\n return createEvidence(obs, isFailure ? 'contradicts' : 'supports');\n });\n\n // Step 3: Evidence -> Candidate Lessons\n const distilled = distillTrajectory(trajectory);\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n\n if (distilled) {\n // Attach observation IDs as evidence backing\n candidateLessons.push({\n id: distilled.id,\n type: 'lesson',\n statement: distilled.statement,\n positive: distilled.positive,\n negative: distilled.negative,\n confidence: distilled.confidence,\n evidence: evidence.map((e) => e.source),\n tags: distilled.tags,\n scope: 'project'\n });\n }\n\n // Step 4: Candidate Lessons -> Reconcile\n const reconciliations: TrajectoryLearningResult['reconciliations'] = [];\n const currentKnowledgeList = [...existingKnowledge];\n\n for (const candidate of candidateLessons) {\n const recResult = reconcileKnowledge(candidate, currentKnowledgeList);\n\n if (dryRun) {\n reconciliations.push({\n candidate,\n result: recResult,\n action: recResult.action\n });\n } else {\n const { updatedKnowledge, action } = applyReconciliation(\n recResult,\n candidate,\n currentKnowledgeList,\n storage\n );\n reconciliations.push({\n candidate,\n result: recResult,\n appliedKnowledge: updatedKnowledge,\n action\n });\n }\n }\n\n return {\n taskId,\n observations,\n evidence,\n candidateLessons,\n reconciliations,\n dryRun\n };\n}\n\n/**\n * Handle explicit user correction as high-quality evidence.\n * Prevents future agents from repeatedly making the same invalid assumption.\n */\nexport function processUserCorrection(params: {\n topic: string;\n incorrectAssumption: string;\n correctFact: string;\n context?: string[];\n author?: string;\n}): {\n observation: Observation;\n knowledge: Knowledge;\n} {\n const now = new Date().toISOString();\n const prov: Provenance = {\n type: 'user',\n timestamp: now,\n ...(params.author ? { author: params.author } : {})\n };\n\n const claim = `User correction on ${params.topic}: ${params.correctFact} (supersedes assumption: ${params.incorrectAssumption})`;\n\n const observation = createObservation({\n source: `user:correction:${params.topic.toLowerCase()}`,\n claim,\n provenance: prov,\n confidence: 1.0,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()]\n });\n\n const evidence = createEvidence(observation, 'supports');\n\n const knowledge = createKnowledge({\n id: `correction.${params.topic.toLowerCase().replace(/[^a-z0-9_-]/g, '.')}`,\n type: 'rule',\n status: 'active',\n statement: params.correctFact,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()],\n confidence: 1.0,\n confidenceTier: 'high',\n evidence: [evidence.id, observation.source],\n tags: ['user-correction', params.topic.toLowerCase()]\n });\n\n return { observation, knowledge };\n}\n","import type { Knowledge, KnowledgeStatus } from './types.js';\n\nexport interface SourceDependencyIndex {\n // source key (e.g. \"src/auth/session.ts\", \"file:src/auth/session.ts\") -> Set of knowledge IDs\n sourceToKnowledge: Map<string, Set<string>>;\n}\n\nexport function normalizeSourceKey(source: string): string {\n return source.replace(/^(file|code|test|doc):/, '').trim().toLowerCase();\n}\n\n/**\n * Builds a reverse index mapping source paths / files to the knowledge IDs that depend on them.\n */\nexport function buildDependencyIndex(knowledgeList: Knowledge[]): SourceDependencyIndex {\n const sourceToKnowledge = new Map<string, Set<string>>();\n\n for (const k of knowledgeList) {\n const allDependencies = new Set<string>();\n\n // Explicit depends_on\n if (k.depends_on) {\n for (const d of k.depends_on) {\n allDependencies.add(normalizeSourceKey(d));\n }\n }\n\n // Implicit evidence references\n if (k.evidence) {\n for (const ev of k.evidence) {\n allDependencies.add(normalizeSourceKey(ev));\n }\n }\n\n for (const dep of allDependencies) {\n if (!dep) continue;\n let set = sourceToKnowledge.get(dep);\n if (!set) {\n set = new Set<string>();\n sourceToKnowledge.set(dep, set);\n }\n set.add(k.id);\n }\n }\n\n return { sourceToKnowledge };\n}\n\nexport interface StalenessCheckResult {\n knowledgeId: string;\n affected: boolean;\n status: KnowledgeStatus;\n changedSources: string[];\n unchangedSources: string[];\n reason?: string;\n}\n\n/**\n * Checks a knowledge item against a list of changed file paths / sources.\n * If any supporting dependency changed, marks as 'needs_revalidation'.\n */\nexport function checkKnowledgeStaleness(\n knowledge: Knowledge,\n changedSources: string[]\n): StalenessCheckResult {\n const normChanged = new Set(changedSources.map(normalizeSourceKey));\n const allDeps = [\n ...(knowledge.depends_on ?? []).map(normalizeSourceKey),\n ...knowledge.evidence.map(normalizeSourceKey)\n ];\n\n const changed: string[] = [];\n const unchanged: string[] = [];\n\n for (const dep of allDeps) {\n if (!dep) continue;\n // Check direct match or path containment\n const isChanged = normChanged.has(dep) || Array.from(normChanged).some((c) => dep.includes(c) || c.includes(dep));\n if (isChanged) {\n changed.push(dep);\n } else {\n unchanged.push(dep);\n }\n }\n\n if (changed.length > 0) {\n const reason = `Supporting dependency changed: ${changed.join(', ')}. Unchanged evidence: ${unchanged.join(', ') || 'none'}`;\n return {\n knowledgeId: knowledge.id,\n affected: true,\n status: 'needs_revalidation',\n changedSources: changed,\n unchangedSources: unchanged,\n reason\n };\n }\n\n return {\n knowledgeId: knowledge.id,\n affected: false,\n status: knowledge.status,\n changedSources: [],\n unchangedSources: allDeps\n };\n}\n\n/**\n * Marks knowledge units as 'needs_revalidation' when their underlying dependencies change,\n * preserving transparent history and reasons without deleting the knowledge.\n */\nexport function markStaleKnowledge(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): { updatedKnowledge: Knowledge[]; affectedCount: number } {\n const now = new Date().toISOString();\n let affectedCount = 0;\n const updatedKnowledge: Knowledge[] = [];\n\n for (const k of knowledgeList) {\n if (k.status === 'superseded' || k.status === 'invalid' || k.status === 'invalidated') {\n updatedKnowledge.push(k);\n continue;\n }\n\n const res = checkKnowledgeStaleness(k, changedSources);\n if (res.affected) {\n affectedCount++;\n const history = k.history ?? [];\n const updated: Knowledge = {\n ...k,\n status: 'needs_revalidation',\n updatedAt: now,\n history: [\n ...history,\n {\n timestamp: now,\n status: 'needs_revalidation',\n action: 'source_changed',\n reason: res.reason\n }\n ]\n };\n updatedKnowledge.push(updated);\n } else {\n updatedKnowledge.push(k);\n }\n }\n\n return { updatedKnowledge, affectedCount };\n}\n\n/**\n * Checks a list of knowledge units against changed sources and returns the affected items.\n */\nexport function checkKnowledgeListStaleness(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): {\n affectedKnowledge: Knowledge[];\n updatedKnowledge: Knowledge[];\n affectedCount: number;\n} {\n const { updatedKnowledge, affectedCount } = markStaleKnowledge(knowledgeList, changedSources);\n const affectedKnowledge = updatedKnowledge.filter((k) => k.status === 'needs_revalidation');\n return { affectedKnowledge, updatedKnowledge, affectedCount };\n}\n","import type {\n Knowledge,\n JevMatchStatus,\n JevExplanation,\n JevResult,\n Scope\n} from '../core/types.js';\n\nexport interface QueryContext {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n}\n\nconst statementTokenCache = new WeakMap<Knowledge, Set<string>>();\n\nfunction extractTokens(text?: string): Set<string> {\n if (!text) return new Set();\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getKnowledgeStatementTokens(k: Knowledge): Set<string> {\n let tokens = statementTokenCache.get(k);\n if (!tokens) {\n tokens = extractTokens(k.statement);\n statementTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\n/**\n * Evaluates JEV-style positive and negative contextual proximity for a knowledge unit.\n */\nexport function evaluateJev(\n knowledge: Knowledge,\n context: QueryContext\n): JevResult {\n const queryTokens = extractTokens(context.query);\n const contextPos = new Set((context.positive ?? []).map((p) => p.trim().toLowerCase()));\n const contextNeg = new Set((context.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n const knowPos = new Set((knowledge.positive ?? []).map((p) => p.trim().toLowerCase()));\n const knowNeg = new Set((knowledge.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n // 1. Negative Conflict Detection\n const negativeConflicts: string[] = [];\n\n // Knowledge forbids something present in positive context\n for (const n of knowNeg) {\n if (contextPos.has(n) || queryTokens.has(n)) {\n negativeConflicts.push(`Knowledge forbids \"${n}\", which was present in context`);\n }\n }\n\n // Context forbids something present in knowledge\n for (const p of knowPos) {\n if (contextNeg.has(p)) {\n negativeConflicts.push(`Context forbids \"${p}\", which is required by knowledge`);\n }\n }\n\n // 2. Positive Matches\n const positiveMatches: string[] = [];\n\n // Direct cue overlap\n for (const p of knowPos) {\n if (contextPos.has(p)) {\n positiveMatches.push(`Context cue: ${p}`);\n } else {\n // Check if any query token matches or stems into cue\n for (const q of queryTokens) {\n if (p === q || p.startsWith(q) || q.startsWith(p)) {\n positiveMatches.push(`Query term match: ${p}`);\n break;\n }\n }\n }\n }\n\n // Statement query token overlap\n const stmtTokens = getKnowledgeStatementTokens(knowledge);\n let queryOverlapCount = 0;\n for (const q of queryTokens) {\n let matched = false;\n for (const st of stmtTokens) {\n if (q === st || q.startsWith(st) || st.startsWith(q)) {\n matched = true;\n break;\n }\n }\n if (matched) {\n queryOverlapCount++;\n positiveMatches.push(`Statement term: ${q}`);\n }\n }\n\n // 3. Positive Score Calculation\n const totalCues = Math.max(1, knowPos.size);\n const matchedCuesCount = positiveMatches.filter((m) => m.startsWith('Context cue') || m.startsWith('Query term')).length;\n const cueMatchRatio = matchedCuesCount / totalCues;\n const tokenOverlapScore = queryTokens.size > 0 ? queryOverlapCount / Math.max(1, queryTokens.size) : 0;\n const rawPositiveScore = 0.65 * cueMatchRatio + 0.35 * tokenOverlapScore;\n\n // 4. Scope Alignment\n let scopeMultiplier = 1.0;\n const targetScope = (context.scope ?? 'project').toLowerCase();\n const knowScope = (knowledge.scope ?? 'project').toLowerCase();\n\n if (targetScope === knowScope) {\n scopeMultiplier = 1.0;\n } else if (knowScope === 'global' || targetScope.startsWith(knowScope)) {\n scopeMultiplier = 0.85;\n } else if (knowScope === 'project' && targetScope.startsWith('branch:')) {\n scopeMultiplier = 0.90;\n } else {\n // Mismatched scopes\n scopeMultiplier = 0.30;\n }\n\n // 5. Confidence and Evidence Ratio\n const m = knowledge.metrics;\n const evRatio = (m.support_count + 1) / (m.support_count + 2 * m.contradiction_count + 1);\n const confidenceFactor = knowledge.confidence * evRatio;\n\n // 6. Outcome Boost / Penalty\n let outcomeAdjustment = 0;\n if (m.successful_outcomes > 0) {\n outcomeAdjustment += Math.min(0.10, m.successful_outcomes * 0.03);\n }\n if (m.failed_outcomes > 0) {\n outcomeAdjustment -= Math.min(0.20, m.failed_outcomes * 0.05);\n }\n\n // 7. Base Combined Score\n let score = (rawPositiveScore * 0.45 + confidenceFactor * 0.40 + outcomeAdjustment) * scopeMultiplier;\n\n // Stale or Contradicted Status Penalty\n if (knowledge.status === 'stale') {\n score *= 0.6;\n } else if (knowledge.status === 'contradicted') {\n score *= 0.3;\n } else if (knowledge.status === 'invalid' || knowledge.status === 'superseded') {\n score *= 0.1;\n }\n\n // 8. Negative Conflict Penalty & Decision\n let status: JevMatchStatus = 'POSSIBLE';\n const reasons: string[] = [];\n\n if (negativeConflicts.length > 0) {\n // Severe penalty for negative conflicts\n score = Math.max(0.01, score * 0.2);\n status = 'REJECT';\n reasons.push(`Rejected due to ${negativeConflicts.length} negative contextual conflicts.`);\n } else if (score >= 0.45 && positiveMatches.length > 0) {\n status = 'MATCH';\n reasons.push(`Strong contextual match with ${positiveMatches.length} matching signals.`);\n } else if (score >= 0.25) {\n status = 'POSSIBLE';\n reasons.push(`Potential match; partial contextual overlap.`);\n } else {\n status = 'REJECT';\n reasons.push(`Insufficient contextual match score (${score.toFixed(2)} < 0.25).`);\n }\n\n const finalScore = Math.round(Math.min(1.0, Math.max(0.0, score)) * 100) / 100;\n\n const explanation: JevExplanation = {\n positiveMatches,\n negativeConflicts,\n score: finalScore,\n confidence: knowledge.confidence,\n status,\n reasons\n };\n\n return {\n knowledge,\n status,\n score: finalScore,\n explanation\n };\n}\n","import type { Knowledge, JevResult } from '../core/types.js';\nimport { evaluateJev, type QueryContext } from './scorer.js';\n\n/**\n * Re-ranks a small set of candidate knowledge units using JEV contextual evaluation.\n */\nexport function rerankCandidates(\n candidates: Knowledge[],\n context: QueryContext\n): JevResult[] {\n const results: JevResult[] = [];\n\n for (const candidate of candidates) {\n const res = evaluateJev(candidate, context);\n results.push(res);\n }\n\n // Sort: MATCH first, then POSSIBLE, then REJECT; within each group, highest score first\n const statusPriority: Record<string, number> = {\n MATCH: 3,\n POSSIBLE: 2,\n REJECT: 1\n };\n\n results.sort((a, b) => {\n const prioDiff = (statusPriority[b.status] ?? 0) - (statusPriority[a.status] ?? 0);\n if (prioDiff !== 0) return prioDiff;\n const scoreDiff = b.score - a.score;\n if (Math.abs(scoreDiff) > 0.001) return scoreDiff;\n return b.knowledge.confidence - a.knowledge.confidence;\n });\n\n return results;\n}\n","import { create, insert, remove, search, type AnyOrama } from '@orama/orama';\nimport type { Knowledge } from '../core/types.js';\n\n/**\n * Rebuildable in-memory search index powered by Orama.\n * Note: Orama is strictly a candidate retrieval cache, NEVER the canonical source of truth.\n */\nexport class SearchIndex {\n private db: AnyOrama | null = null;\n private idToDocId = new Map<string, string>();\n\n async init(): Promise<void> {\n this.db = await create({\n schema: {\n id: 'string',\n statement: 'string',\n type: 'string',\n scope: 'string',\n status: 'string',\n positive: 'string[]',\n negative: 'string[]',\n tags: 'string[]'\n }\n });\n this.idToDocId.clear();\n }\n\n async buildIndex(knowledgeList: Knowledge[]): Promise<void> {\n await this.init();\n for (const item of knowledgeList) {\n await this.upsert(item);\n }\n }\n\n async upsert(item: Knowledge): Promise<void> {\n if (!this.db) {\n await this.init();\n }\n\n // If already in index, remove first\n const existingDocId = this.idToDocId.get(item.id);\n if (existingDocId) {\n try {\n await remove(this.db!, existingDocId);\n } catch {\n // Ignore if already deleted\n }\n this.idToDocId.delete(item.id);\n }\n\n const docId = await insert(this.db!, {\n id: item.id,\n statement: item.statement,\n type: item.type,\n scope: item.scope,\n status: item.status,\n positive: item.positive,\n negative: item.negative,\n tags: item.tags ?? []\n });\n\n this.idToDocId.set(item.id, docId);\n }\n\n async delete(id: string): Promise<void> {\n if (!this.db) return;\n const docId = this.idToDocId.get(id);\n if (docId) {\n try {\n await remove(this.db, docId);\n } catch {\n // Ignore\n }\n this.idToDocId.delete(id);\n }\n }\n\n async searchCandidates(term: string, limit = 25): Promise<string[]> {\n if (!this.db) {\n return [];\n }\n\n const cleanTerm = term.trim();\n if (!cleanTerm) {\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n\n try {\n const results = await search(this.db, {\n term: cleanTerm,\n limit,\n threshold: 0.2\n });\n\n return results.hits.map((h) => (h.document as any).id as string);\n } catch {\n // Fallback: term might contain special characters or fail tokenization\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n }\n\n size(): number {\n return this.idToDocId.size;\n }\n}\n\nexport { SearchIndex as OramaIndex };\n\n","import type { Knowledge, JevResult, Scope } from '../core/types.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport type { QueryContext } from '../jev/scorer.js';\nimport type { SearchIndex } from './indexer.js';\n\nexport interface LookupOptions {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n limit?: number;\n includeRejected?: boolean;\n}\n\nexport interface KnowledgeStoreProvider {\n getKnowledge(id: string): Promise<Knowledge | undefined>;\n getAllKnowledge(): Promise<Knowledge[]>;\n}\n\nexport class Retriever {\n constructor(\n private index: SearchIndex,\n private store: KnowledgeStoreProvider\n ) {}\n\n /**\n * Executes the full Bilmem retrieval pipeline:\n * 1. Query / Context\n * 2. Candidate retrieval (small candidate set)\n * 3. JEV contextual reranking\n * 4. MATCH / POSSIBLE / REJECT classification with explanations\n */\n async lookup(options: LookupOptions = {}): Promise<JevResult[]> {\n const limit = options.limit ?? 5;\n const query = options.query?.trim() ?? '';\n const positive = options.positive ?? [];\n const negative = options.negative ?? [];\n const scope = options.scope ?? 'project';\n\n const searchTerms: string[] = [];\n if (query) searchTerms.push(query);\n if (positive.length > 0) searchTerms.push(...positive.slice(0, 3));\n\n const searchTerm = searchTerms.join(' ').trim();\n\n // 1. Retrieve Candidate IDs from Orama\n let candidateIds = await this.index.searchCandidates(searchTerm, 30);\n\n // If no candidate found via search or empty term, get active items from store\n let candidates: Knowledge[] = [];\n if (candidateIds.length === 0) {\n const all = await this.store.getAllKnowledge();\n candidates = all.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const id of candidateIds) {\n const item = await this.store.getKnowledge(id);\n if (item && item.status !== 'invalid' && item.status !== 'superseded') {\n candidates.push(item);\n }\n }\n\n // If candidates are very few (< 5), broaden candidate pool with active knowledge\n if (candidates.length < 5) {\n const all = await this.store.getAllKnowledge();\n for (const k of all) {\n if (!candidateIds.includes(k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n candidates.push(k);\n if (candidates.length >= 20) break;\n }\n }\n }\n }\n\n // 2. JEV Reranking on Candidates\n const queryContext: QueryContext = {\n query,\n positive,\n negative,\n scope\n };\n\n const reranked = rerankCandidates(candidates, queryContext);\n\n // 3. Filter by includeRejected and limit\n const filtered = options.includeRejected\n ? reranked\n : reranked.filter((r) => r.status !== 'REJECT');\n\n return filtered.slice(0, limit);\n }\n}\n\nexport { Retriever as BilmemRetriever };\n\n","import type {\n Knowledge,\n InvestigationReceipt,\n ResolutionResult,\n ResolutionState,\n ResolutionReason,\n ResolveOptions,\n NextEvidenceAction,\n ActionType,\n Scope,\n JevResult\n} from './types.js';\nimport { rerankCandidates } from '../jev/index.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport type { Storage } from '../storage/canonical.js';\n\n/**\n * Relative cost table for evidence-gathering actions.\n * Smallest action likely to resolve uncertainty is preferred.\n */\nexport const RELATIVE_COSTS: Record<ActionType, number> = {\n USE_KNOWLEDGE: 1,\n REVALIDATE: 2,\n INSPECT_TEST: 2,\n INSPECT_FILE: 2,\n INSPECT_SYMBOL: 2.5,\n CHECK_DOCUMENTATION: 2.5,\n CHECK_GIT: 3,\n SEARCH_REPOSITORY: 4,\n ASK_USER: 3.5, // Context-dependent; cheaper than broad scan when specifically targeted\n STOP: 1\n};\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n/**\n * Core Epistemic Resolver:\n * Answers: \"Do I know enough to act, what do I know does not apply,\n * what am I missing, and what is the cheapest next step to resolve the uncertainty?\"\n */\nexport async function resolveEpistemicQuery(\n options: ResolveOptions,\n storage: Storage,\n retriever?: Retriever | SearchIndex\n): Promise<ResolutionResult> {\n const question = options.question.trim();\n const positive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Context Extraction: extract keywords from the question + explicit cues\n const queryTokens = tokenize(question);\n const contextualCues = Array.from(new Set([...positive, ...queryTokens]));\n\n // 2. Candidate Retrieval & 3. JEV Applicability Filtering\n const allKnowledge = await storage.getAllKnowledge();\n let jevResults: JevResult[];\n\n if (retriever instanceof Retriever) {\n jevResults = await retriever.lookup({\n query: question,\n positive: options.positive,\n negative: options.negative,\n scope,\n limit: options.limit ?? 25,\n includeRejected: true\n });\n } else {\n let candidatePool: Knowledge[] = [];\n if (retriever instanceof SearchIndex) {\n const queryTerm = queryTokens.slice(0, 5).join(' ');\n const ids = await retriever.searchCandidates(queryTerm, 30);\n for (const id of ids) {\n const item = await storage.getKnowledge(id);\n if (item) candidatePool.push(item);\n }\n }\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge;\n }\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.positive.some((p) => contextualCues.includes(p))) {\n candidatePool.push(k);\n }\n }\n jevResults = rerankCandidates(candidatePool, {\n positive: options.positive,\n negative: options.negative,\n scope\n });\n }\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n let jevReason = 'INSUFFICIENT_CONTEXT';\n if (res.explanation.negativeConflicts.length > 0) {\n jevReason = 'HARD_NEGATIVE';\n } else if (res.explanation.reasons.some((r) => r.toLowerCase().includes('scope'))) {\n jevReason = 'SCOPE_MISMATCH';\n } else if (res.knowledge.status === 'stale' || res.knowledge.status === 'needs_revalidation') {\n jevReason = 'STALE_KNOWLEDGE';\n }\n\n await storage.appendMetricEvent({\n type: 'jev_result',\n knowledgeId: res.knowledge.id,\n result: res.status,\n reason: jevReason,\n timestamp: Date.now()\n });\n\n if (jevReason === 'HARD_NEGATIVE') {\n await storage.appendMetricEvent({\n type: 'jev_hard_negative',\n knowledgeId: res.knowledge.id,\n timestamp: Date.now()\n });\n }\n\n if (res.status === 'REJECT') {\n const conflictMsg = res.explanation.negativeConflicts.length > 0\n ? `${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({\n id: res.knowledge.id,\n reason: conflictMsg\n });\n } else if (res.status === 'MATCH' || res.status === 'POSSIBLE') {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 4. Retrieve Past Investigation Receipts to Avoid Redundant Work\n const receipts = await storage.getAllReceipts();\n const previouslyChecked = new Set<string>();\n const previouslyRejectedTargets = new Map<string, string>();\n\n // Find receipts relating to this question or overlapping context\n for (const r of receipts) {\n const qOverlap = tokenize(r.question).filter((t) => queryTokens.includes(t));\n if (qOverlap.length >= 2 || (r.positive && r.positive.some((p) => contextualCues.includes(p)))) {\n await storage.appendMetricEvent({\n type: 'investigation_reused',\n investigationId: r.id,\n timestamp: Date.now()\n });\n for (const c of r.checked) {\n previouslyChecked.add(c);\n }\n for (const rej of r.rejected) {\n previouslyRejectedTargets.set(rej.target, rej.reason);\n }\n }\n }\n\n // Add paths from existing evidence of matching items to checked list\n for (const m of matchingItems) {\n for (const ev of m.evidence) {\n previouslyChecked.add(ev.replace(/^(code|file|test|doc):/, ''));\n }\n if (m.depends_on) {\n for (const dep of m.depends_on) {\n previouslyChecked.add(dep.replace(/^(code|file|test|doc):/, ''));\n }\n }\n }\n\n // 5. Evidence & Staleness Evaluation\n const staleCandidates = matchingItems.filter((k) => k.status === 'needs_revalidation' || k.status === 'stale');\n const contradictedCandidates = matchingItems.filter((k) => k.status === 'contradicted');\n const activeCandidates = matchingItems.filter(\n (k) =>\n (k.status === 'active' || k.stage === 'active' || k.stage === 'probation') &&\n k.status !== 'needs_revalidation' &&\n k.status !== 'stale' &&\n k.status !== 'contradicted' &&\n k.status !== 'invalid' &&\n k.status !== 'superseded'\n );\n\n // 6. Question Memory: Check if a learned QUESTION exists for this uncertainty pattern\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n let learnedQuestionToAsk: { question: string; targetTopic: string; reason: string } | undefined;\n\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualCues.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n learnedQuestionToAsk = {\n question: qk.question,\n targetTopic: qk.resolves?.[0] || 'uncertainty',\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`\n };\n break;\n }\n }\n\n // 7. Missing Aspects / Gap Analysis\n const coveredTokens = new Set<string>();\n for (const k of activeCandidates) {\n for (const t of tokenize(k.statement)) coveredTokens.add(t);\n for (const p of k.positive) coveredTokens.add(p);\n }\n\n const missingAspects: string[] = [];\n for (const qt of queryTokens) {\n if (!['how', 'what', 'why', 'when', 'where', 'are', 'the', 'for', 'with', 'does', 'from'].includes(qt)) {\n if (!coveredTokens.has(qt)) {\n missingAspects.push(qt);\n }\n }\n }\n\n // 8. Determine Resolution State\n let state: ResolutionState = 'UNKNOWN';\n let reason: ResolutionReason | undefined;\n\n if (activeCandidates.length === 0 && staleCandidates.length > 0) {\n state = 'STALE';\n reason = 'STALE_EVIDENCE';\n } else if (activeCandidates.length === 0 && contradictedCandidates.length > 0) {\n state = 'CONFLICTED';\n reason = 'CONFLICTING_EVIDENCE';\n } else if (activeCandidates.length === 0) {\n state = 'UNKNOWN';\n reason = rejectedItems.length > 0 && matchingItems.length === 0 ? 'CONTEXT_MISMATCH' : 'NOT_OBSERVED';\n } else if (missingAspects.length === 0 && activeCandidates.some((k) => k.confidence >= 0.85)) {\n state = 'KNOWN';\n } else {\n state = 'PARTIALLY_KNOWN';\n reason = 'INSUFFICIENT_EVIDENCE';\n }\n\n // 9. Deterministic Next Evidence Action Planner\n const checkedArray = Array.from(previouslyChecked);\n let nextAction: NextEvidenceAction | undefined;\n let fallback: ResolutionResult['fallback'];\n\n if (state === 'KNOWN') {\n nextAction = {\n type: 'USE_KNOWLEDGE',\n target: activeCandidates[0].id,\n reason: `Sufficient high-confidence knowledge available (${activeCandidates[0].id})`,\n relativeCost: RELATIVE_COSTS.USE_KNOWLEDGE,\n expectedInfoGain: 0.95\n };\n } else if (state === 'CONFLICTED') {\n nextAction = {\n type: 'ASK_USER',\n reason: 'Opposing credible knowledge requires contextual disambiguation',\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: `Conflicting conventions exist for \"${question}\". Which context applies?`\n };\n } else if (state === 'STALE') {\n const staleItem = staleCandidates[0];\n const targetSource = staleItem.depends_on?.[0] || staleItem.evidence[0] || 'source';\n nextAction = {\n type: 'INSPECT_FILE',\n target: targetSource.replace(/^(code|file|test|doc):/, ''),\n reason: `Revalidate stale knowledge (${staleItem.id}) whose dependencies changed`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.85\n };\n } else {\n // PARTIALLY_KNOWN or UNKNOWN: find cheapest untried action\n // Candidate actions ranked by expected information gain / relative cost\n\n // Priority 1: Learned Question from Question Memory (if high expected value)\n if (learnedQuestionToAsk) {\n nextAction = {\n type: 'ASK_USER',\n reason: learnedQuestionToAsk.reason,\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: learnedQuestionToAsk.question\n };\n } else {\n // Priority 2: Check candidate test or file evidence not yet inspected\n const testCandidates = [\n `tests/${queryTokens[0] || 'module'}.test.ts`,\n `test/${queryTokens[0] || 'module'}.test.ts`,\n `tests/session-refresh.test.ts`\n ];\n\n const uninspectedTest = testCandidates.find(\n (t) => !previouslyChecked.has(t) && !previouslyRejectedTargets.has(t)\n );\n\n const fileCandidates = [\n `src/${queryTokens[0] || 'auth'}/${queryTokens[1] || 'index'}.ts`,\n `src/${queryTokens[0] || 'index'}.ts`\n ];\n\n const uninspectedFile = fileCandidates.find(\n (f) => !previouslyChecked.has(f) && !previouslyRejectedTargets.has(f)\n );\n\n for (const t of testCandidates) {\n if (previouslyChecked.has(t)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: t,\n timestamp: Date.now()\n });\n }\n }\n for (const f of fileCandidates) {\n if (previouslyChecked.has(f)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: f,\n timestamp: Date.now()\n });\n }\n }\n\n if (uninspectedTest && missingAspects.some((m) => m.includes('order') || m.includes('test') || m.includes('behavior'))) {\n nextAction = {\n type: 'INSPECT_TEST',\n target: uninspectedTest,\n reason: `Targeted test inspection for unconfirmed aspect: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_TEST,\n expectedInfoGain: 0.8\n };\n } else if (uninspectedFile) {\n nextAction = {\n type: 'INSPECT_FILE',\n target: uninspectedFile,\n reason: `Direct source inspection for missing context: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.75\n };\n } else {\n // Fallback to targeted symbol/repository search\n nextAction = {\n type: 'SEARCH_REPOSITORY',\n target: missingAspects.slice(0, 3).join(' ') || question,\n reason: `Targeted search for unobserved aspects: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.SEARCH_REPOSITORY,\n expectedInfoGain: 0.6\n };\n }\n\n fallback = {\n type: 'ask',\n question: `Could you clarify: ${question}? (Missing: ${missingAspects.join(', ') || 'specifics'})`\n };\n }\n }\n\n // Record Metric Events\n if (state === 'KNOWN' || (nextAction && nextAction.type !== 'SEARCH_REPOSITORY' && nextAction.type !== 'STOP')) {\n await storage.appendMetricEvent({\n type: 'broad_search_avoided',\n targetAction: nextAction?.type,\n timestamp: Date.now()\n });\n }\n\n for (const k of activeCandidates) {\n await storage.appendMetricEvent({\n type: 'knowledge_reused',\n knowledgeId: k.id,\n timestamp: Date.now()\n });\n }\n\n if (learnedQuestionToAsk || fallback?.type === 'ask') {\n await storage.appendMetricEvent({\n type: 'question_suggested',\n question: learnedQuestionToAsk?.question || fallback?.question,\n timestamp: Date.now()\n });\n }\n\n await storage.appendMetricEvent({\n type: 'resolve',\n state,\n action: nextAction?.type,\n question,\n timestamp: Date.now()\n });\n\n // 10. Record Investigation Receipt\n const receiptId = `receipt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const receipt: InvestigationReceipt = {\n id: receiptId,\n question,\n checked: checkedArray,\n findings: activeCandidates.map((c) => c.statement),\n rejected: rejectedItems.map((r) => ({ target: r.id, reason: r.reason })),\n missing: missingAspects,\n next: nextAction,\n status: state === 'KNOWN' ? 'resolved' : 'unresolved',\n timestamp: new Date().toISOString(),\n positive,\n negative\n };\n\n await storage.saveReceipt(receipt);\n\n return {\n state,\n reason,\n known: activeCandidates.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier ?? k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n })),\n applicable: positive.length > 0 ? positive : contextualCues.slice(0, 5),\n rejected: rejectedItems,\n missing: missingAspects,\n checked: checkedArray,\n next: nextAction,\n fallback,\n receiptId\n };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport type { Storage } from '../storage/canonical.js';\nimport type { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport { checkKnowledgeListStaleness } from './dependencies.js';\nimport type {\n Knowledge,\n UnknownRecord,\n InvestigationReceipt,\n NextEvidenceAction,\n PreflightOptions,\n PreflightResult,\n PreflightConstraint,\n PreflightLesson,\n PreflightFailure,\n PreflightUnknown,\n PreflightStale,\n PreflightMissing,\n PreflightQuestion,\n PreflightAlreadyInvestigated,\n ReadinessStatus,\n UnknownClassification\n} from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst STOP_WORDS = new Set([\n 'add', 'implement', 'create', 'support', 'with', 'the', 'a', 'an', 'for', 'in',\n 'to', 'and', 'of', 'on', 'from', 'using', 'via', 'into', 'by', 'our', 'new',\n 'use', 'make', 'allow', 'enable', 'provide', 'setup', 'set'\n]);\n\nconst DOMAIN_KEYWORDS: Record<string, string[]> = {\n authentication: ['auth', 'oauth', 'login', 'logout', 'session', 'jwt', 'token', 'credential', 'sso', 'password'],\n session: ['session', 'cookie', 'cookies', 'expiry', 'refresh', 'token'],\n 'user-identity': ['user', 'account', 'profile', 'identity', 'member', 'role', 'permission'],\n database: ['db', 'database', 'sql', 'postgres', 'sqlite', 'migration', 'schema', 'table', 'query'],\n storage: ['storage', 's3', 'bucket', 'file', 'upload', 'disk', 'blob'],\n api: ['api', 'endpoint', 'http', 'rest', 'route', 'controller', 'middleware', 'graphql'],\n caching: ['cache', 'redis', 'memcached', 'ttl', 'invalidation'],\n billing: ['payment', 'stripe', 'checkout', 'billing', 'subscription', 'invoice', 'credit'],\n 'data-processing': ['import', 'export', 'csv', 'bulk', 'batch', 'stream', 'pipeline']\n};\n\nexport function tokenizeGoal(goal: string): string[] {\n return goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2 && !STOP_WORDS.has(t));\n}\n\nexport function inferLikelyDomains(tokens: string[], knowledgeTags: string[]): string[] {\n const domains = new Set<string>();\n\n for (const token of tokens) {\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n if (keywords.includes(token) || token.includes(domain)) {\n domains.add(domain);\n }\n }\n }\n\n for (const tag of knowledgeTags) {\n const norm = tag.toLowerCase().trim();\n if (DOMAIN_KEYWORDS[norm]) {\n domains.add(norm);\n }\n }\n\n return Array.from(domains);\n}\n\n/**\n * Classifies an unknown into BLOCKING, IMPORTANT, or NON_BLOCKING.\n * When uncertain, prefers IMPORTANT rather than falsely declaring blocking.\n */\nexport function classifyUnknown(\n unknown: {\n id: string;\n statement?: string;\n reason?: string;\n question?: string;\n next?: { type: string; question?: string; target?: string };\n blocking?: boolean;\n },\n goalTokens: string[],\n domainCues: string[]\n): {\n classification: UnknownClassification;\n isDecision: boolean;\n reason: string;\n} {\n const text = `${unknown.id} ${unknown.statement || ''} ${unknown.question || unknown.next?.question || ''}`.toLowerCase();\n\n // Explicit flag check first\n if (unknown.blocking === true) {\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|linking|collision|merge|choice)\\b/i.test(text);\n return {\n classification: 'BLOCKING',\n isDecision: isDecision || true,\n reason: unknown.reason || 'Blocking unknown identified for this goal'\n };\n }\n\n if (unknown.blocking === false) {\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|choice)\\b/i.test(text);\n return {\n classification: 'NON_BLOCKING',\n isDecision,\n reason: 'Operational or instrumentation detail not blocking core functionality'\n };\n }\n\n // 1. Non-blocking: operational details\n const isNonBlocking = /\\b(analytics|telemetry|metric|event name|logging level|log format|button color|styling|theme)\\b/i.test(text);\n if (isNonBlocking) {\n return {\n classification: 'NON_BLOCKING',\n isDecision: /\\b(should|which name|choice)\\b/i.test(text),\n reason: 'Operational or instrumentation detail not blocking core functionality'\n };\n }\n\n // 2. Decision check: questions involving choices/policies\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|linking|collision|merge)\\b/i.test(text);\n\n // 3. Blocking: core architectural / entity linking / protocol / security ambiguity\n const isBlockingCandidate = /\\b(link|linking|collision|duplicate|merge|security|permission|storage-engine|protocol|auth-flow|credentials)\\b/i.test(text);\n const overlapsGoal = goalTokens.some((t) => text.includes(t)) || domainCues.some((d) => text.includes(d));\n\n if (isBlockingCandidate && (overlapsGoal || unknown.reason === 'UNRESOLVABLE_LOCALLY')) {\n return {\n classification: 'BLOCKING',\n isDecision: true,\n reason: 'Unresolved architectural or behavioral decision critical to goal implementation'\n };\n }\n\n // Default: IMPORTANT\n return {\n classification: 'IMPORTANT',\n isDecision,\n reason: isDecision ? 'Product or behavior decision requiring attention' : 'Important implementation detail'\n };\n}\n\n/**\n * Prioritizes and consolidates questions using question memory and expected value.\n */\nexport function prioritizeQuestions(\n rawQuestions: Array<{ question: string; reason: string; targetTopic?: string; isBlocking?: boolean; outcomeScore?: number }>,\n blockingUnknowns: PreflightUnknown[]\n): PreflightQuestion[] {\n const consolidated = new Map<string, PreflightQuestion>();\n\n for (const rq of rawQuestions) {\n const qText = rq.question.trim();\n if (!qText) continue;\n\n // Normalize topic for consolidation\n const topic = rq.targetTopic || qText.toLowerCase().replace(/[^a-z0-9]/g, ' ').slice(0, 30);\n \n // Heuristic: expected resolution value / interaction cost\n let expectedResolutionValue = 1.0;\n if (rq.isBlocking) expectedResolutionValue += 2.0;\n if (rq.outcomeScore && rq.outcomeScore > 0) expectedResolutionValue += 1.0;\n if (rq.outcomeScore && rq.outcomeScore < 0) expectedResolutionValue -= 0.5;\n\n const interactionCost = 1.0;\n const priorityScore = Math.max(0.1, expectedResolutionValue) / interactionCost;\n\n const existing = consolidated.get(topic);\n if (!existing || (priorityScore > (existing.priorityScore ?? 0))) {\n consolidated.set(topic, {\n question: qText,\n reason: rq.reason,\n targetTopic: rq.targetTopic,\n expectedResolutionValue,\n interactionCost,\n priorityScore\n });\n }\n }\n\n return Array.from(consolidated.values()).sort((a, b) => (b.priorityScore ?? 0) - (a.priorityScore ?? 0));\n}\n\n/**\n * Executes Preflight Pipeline for a given goal.\n * Answers: \"What must I know before I start this work?\"\n */\nexport async function executePreflight(\n options: PreflightOptions,\n storage: Storage,\n retriever?: Retriever,\n index?: SearchIndex\n): Promise<PreflightResult> {\n const goal = options.goal.trim();\n const explicitPositive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Goal Context Extraction\n const goalTokens = tokenizeGoal(goal);\n const allKnowledge = await storage.getAllKnowledge();\n const allTags = allKnowledge.flatMap((k) => k.tags ?? []);\n const likelyDomains = inferLikelyDomains(goalTokens, allTags);\n const contextualPositive = Array.from(new Set([...explicitPositive, ...likelyDomains, ...goalTokens]));\n\n // 2. Candidate Retrieval & JEV Applicability Filtering\n let candidatePool: Knowledge[] = [];\n\n if (retriever) {\n const jevCandidates = await retriever.lookup({\n query: goal,\n positive: contextualPositive,\n negative,\n scope,\n limit: options.maxCandidates ?? 25,\n includeRejected: true\n });\n for (const r of jevCandidates) {\n if (r.knowledge) candidatePool.push(r.knowledge);\n }\n }\n\n // Broaden candidate pool if needed\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n const matchesToken = goalTokens.some((t) => k.id.toLowerCase().includes(t) || k.statement.toLowerCase().includes(t));\n const matchesCues = k.positive.some((p) => contextualPositive.includes(p));\n if (matchesToken || matchesCues) {\n candidatePool.push(k);\n }\n }\n }\n }\n\n // Evaluate candidate pool with JEV\n const jevResults = rerankCandidates(candidatePool, {\n query: goal,\n positive: contextualPositive,\n negative,\n scope\n });\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n if (res.status === 'REJECT') {\n const reason = res.explanation.negativeConflicts.length > 0\n ? `Inapplicable: ${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({ id: res.knowledge.id, reason });\n } else {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 3. Deep Preflight: Optional targeted file/git staleness check\n if (options.deep) {\n try {\n const { stdout: diffOutput } = await execFileAsync(\n 'git',\n ['diff', '--name-only', 'HEAD~1'],\n { cwd: storage.getBaseDir() ? path.dirname(storage.getBaseDir()) : process.cwd() }\n );\n const changedFiles = diffOutput.split('\\n').map((f) => f.trim()).filter(Boolean);\n if (changedFiles.length > 0) {\n const staleness = checkKnowledgeListStaleness(matchingItems, changedFiles);\n for (const affected of staleness.affectedKnowledge) {\n const matchIdx = matchingItems.findIndex((m) => m.id === affected.id);\n if (matchIdx >= 0) {\n matchingItems[matchIdx] = affected;\n }\n }\n }\n } catch {\n // Git command failed or not a repo; non-fatal\n }\n }\n\n // 4. Categorize Matching Knowledge into Constraints, Lessons, Past Failures, Stale, Known\n const constraints: PreflightConstraint[] = [];\n const lessons: PreflightLesson[] = [];\n const pastFailures: PreflightFailure[] = [];\n const stale: PreflightStale[] = [];\n const known: PreflightResult['known'] = [];\n let conflictedCount = 0;\n\n const CONSTRAINT_PATTERN = /\\b(must|must not|never|only|cannot|require|required|boundary|strictly|prohibited|forbidden)\\b/i;\n const FAILURE_PATTERN = /(fail|bug|error|crash|duplicate write|race condition|pressure|leak|revert|timeout)/i;\n\n const rootDir = storage.getBaseDir() ? path.dirname(storage.getBaseDir()) : process.cwd();\n\n for (const k of matchingItems) {\n // Check conflicted\n const matchesContradiction =\n k.status === 'contradicted' ||\n (k.contradicts && k.contradicts.some((cid) => matchingItems.some((m) => m.id === cid)));\n if (matchesContradiction) {\n conflictedCount++;\n }\n\n // Check stale\n let isStale = k.status === 'needs_revalidation' || k.status === 'stale';\n let staleReason = k.history?.[k.history.length - 1]?.reason || 'Supporting source changed after last validation';\n const changedDeps: string[] = [];\n\n const candidateDeps = [...(k.depends_on ?? []), ...(k.evidence ?? [])];\n const timestampStr = (k as any).updated_at ?? k.updatedAt ?? k.createdAt;\n const knowledgeTime = new Date(timestampStr).getTime();\n\n for (const dep of candidateDeps) {\n const cleanPath = dep.replace(/^(file|code|test|doc):/, '').trim();\n if (!cleanPath) continue;\n const absPath = path.isAbsolute(cleanPath) ? cleanPath : path.resolve(rootDir, cleanPath);\n try {\n const stat = await fs.stat(absPath);\n if (stat.mtimeMs > knowledgeTime + 500) {\n isStale = true;\n changedDeps.push(cleanPath);\n staleReason = `Supporting source changed after last validation (${cleanPath})`;\n }\n } catch {\n // File doesn't exist on disk, ignore\n }\n }\n\n if (isStale) {\n stale.push({\n id: k.id,\n statement: k.statement,\n reason: staleReason,\n changedSources: changedDeps.length > 0 ? changedDeps : k.depends_on\n });\n continue;\n }\n\n // Check constraints\n const isConstraint =\n k.type === 'rule' ||\n k.type === 'decision' ||\n k.type === 'convention' ||\n CONSTRAINT_PATTERN.test(k.statement);\n\n if (isConstraint) {\n constraints.push({\n id: k.id,\n statement: k.statement,\n type: k.type,\n confidence: k.confidence,\n confidenceTier: k.confidenceTier,\n source: k.evidence?.[0]\n });\n continue;\n }\n\n // Check past failures\n const isFailure =\n k.type === 'failure' ||\n k.statement.startsWith('[FAILURE]') ||\n k.statement.startsWith('[REVERT]') ||\n FAILURE_PATTERN.test(k.statement) ||\n k.metrics.failed_outcomes > 0;\n\n if (isFailure) {\n pastFailures.push({\n id: k.id,\n statement: k.statement,\n context: k.context || {\n positive: k.positive,\n negative: k.negative\n },\n failure: k.statement,\n lesson: k.lesson || (k as any).reasoning || k.resolves?.[0],\n evidence: k.evidence\n });\n continue;\n }\n\n // Check lessons: explicit lesson or lesson in statement/id/tags\n const isLesson =\n (k.type === 'lesson' && (k.id.includes('lesson') || k.tags?.includes('lesson') || k.statement.toLowerCase().includes('lesson'))) ||\n k.statement.toLowerCase().startsWith('lesson:') ||\n k.statement.toLowerCase().includes('lesson:');\n\n if (isLesson) {\n lessons.push({\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n domain: k.tags?.[0],\n evidence: k.evidence\n });\n continue;\n }\n\n // General Known\n if (k.status === 'active' || k.stage === 'active' || k.stage === 'probation' || !k.status) {\n known.push({\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n });\n }\n }\n\n // 5. Existing Unknowns & Classification\n const unknownsFromStorage = await storage.getAllUnknowns();\n const unknownKnowledge = allKnowledge.filter((k) => k.type === 'unknown');\n\n const unifiedUnknowns: Array<{\n id: string;\n statement: string;\n reason?: string;\n question?: string;\n next?: { type: string; question?: string; target?: string };\n blocking?: boolean;\n positive?: string[];\n negative?: string[];\n checked?: string[];\n }> = [];\n\n const seenUnknownIds = new Set<string>();\n\n for (const u of unknownsFromStorage) {\n seenUnknownIds.add(u.id);\n unifiedUnknowns.push({\n id: u.id,\n statement: u.statement || u.id,\n reason: u.reason,\n question: u.question || u.next?.question,\n next: u.next,\n blocking: (u as any).blocking,\n positive: (u as any).positive,\n negative: (u as any).negative,\n checked: u.checked\n });\n }\n\n for (const k of unknownKnowledge) {\n if (!seenUnknownIds.has(k.id)) {\n seenUnknownIds.add(k.id);\n unifiedUnknowns.push({\n id: k.id,\n statement: k.statement,\n reason: k.history?.[0]?.reason,\n question: k.question || (k.statement.includes('?') ? k.statement : undefined),\n next: {\n type: 'ask',\n target: k.id,\n question: k.question || k.statement\n },\n blocking: k.blocking,\n positive: k.positive,\n negative: k.negative,\n checked: k.depends_on || k.evidence\n });\n }\n }\n\n const unknowns: PreflightUnknown[] = [];\n const missing: PreflightMissing[] = [];\n const rawQuestions: Array<{ question: string; reason: string; targetTopic?: string; isBlocking?: boolean; outcomeScore?: number }> = [];\n\n for (const u of unifiedUnknowns) {\n const text = `${u.id} ${u.statement || ''} ${u.question || ''}`.toLowerCase();\n const overlaps =\n goalTokens.some((t) => text.includes(t)) ||\n likelyDomains.some((d) => text.includes(d)) ||\n (u.positive && u.positive.some((p) => contextualPositive.includes(p)));\n\n // Negative filtering: if negative cues match\n if (u.negative && u.negative.some((n) => contextualPositive.includes(n))) {\n continue;\n }\n\n if (overlaps) {\n const { classification, isDecision, reason } = classifyUnknown(u, goalTokens, likelyDomains);\n const isBlocking = classification === 'BLOCKING';\n\n unknowns.push({\n id: u.id,\n statement: u.statement,\n question: u.question || u.statement,\n classification,\n blocking: isBlocking,\n reason\n });\n\n if (isDecision) {\n missing.push({\n type: 'decision',\n subject: u.id,\n question: u.question || u.statement,\n reason\n });\n } else {\n missing.push({\n type: 'evidence',\n subject: u.id,\n question: u.question || u.statement,\n reason\n });\n }\n\n const qText = u.question || (u.statement && u.statement.includes('?') ? u.statement : undefined);\n if (qText) {\n rawQuestions.push({\n question: qText,\n reason: `Unknown: ${u.id} (${reason})`,\n targetTopic: u.id,\n isBlocking\n });\n }\n }\n }\n\n // Question memory: search for learned questions\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualPositive.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n rawQuestions.push({\n question: qk.question,\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`,\n targetTopic: qk.resolves?.[0] || qk.id,\n outcomeScore: (qk.metrics?.successful_outcomes ?? 0) - (qk.metrics?.failed_outcomes ?? 0)\n });\n }\n }\n\n // 6. Prioritize & Consolidate Questions\n const questions = prioritizeQuestions(rawQuestions, unknowns);\n\n // 7. Avoid Repeated Investigation via Investigation Receipts\n const receipts = await storage.getAllReceipts();\n const alreadyInvestigated: PreflightAlreadyInvestigated[] = [];\n const investigatedSources = new Set<string>();\n\n for (const r of receipts) {\n const qTokens = r.question.toLowerCase().split(/\\s+/).filter(Boolean);\n const overlapsGoal = qTokens.some((t) => goalTokens.includes(t));\n const overlapsCues = r.positive && r.positive.some((p) => contextualPositive.includes(p));\n\n if (overlapsGoal || overlapsCues) {\n for (const checked of r.checked) {\n investigatedSources.add(checked.toLowerCase());\n alreadyInvestigated.push({\n source: checked,\n result: r.findings[0] || (r.rejected[0]?.reason) || 'Did not establish requested behavior',\n nextSuggestion: 'ASK_USER'\n });\n }\n }\n }\n\n // 8. Determine Readiness\n let readiness: ReadinessStatus = 'READY';\n\n const totalRelevantKnowledge = known.length + constraints.length + lessons.length + pastFailures.length + stale.length;\n const hasBlockingUnknown = unknowns.some((u) => u.blocking);\n const hasMissingDecision = missing.some((m) => m.type === 'decision');\n\n if (totalRelevantKnowledge === 0 && unknowns.length === 0) {\n readiness = 'INSUFFICIENT_KNOWLEDGE';\n } else if (conflictedCount > 0) {\n readiness = 'CONFLICTED';\n } else if (hasBlockingUnknown || hasMissingDecision) {\n readiness = 'NEEDS_CLARIFICATION';\n } else if (stale.length > 0) {\n readiness = 'NEEDS_REVALIDATION';\n } else {\n readiness = 'READY';\n }\n\n // 9. Cheapest Next Pre-Implementation Actions\n const next: NextEvidenceAction[] = [];\n\n // If decisions needed -> ASK_USER\n for (const m of missing) {\n if (m.type === 'decision') {\n next.push({\n type: 'ASK_USER',\n target: m.subject,\n reason: m.question || m.reason,\n relativeCost: 1.0,\n expectedInfoGain: 0.95\n });\n }\n }\n\n // If stale items -> REVALIDATE\n for (const s of stale) {\n next.push({\n type: 'REVALIDATE',\n target: s.id,\n reason: s.reason,\n relativeCost: 2.0,\n expectedInfoGain: 0.85\n });\n }\n\n // If missing evidence\n for (const m of missing) {\n if (m.type === 'evidence') {\n const wasChecked =\n investigatedSources.has(m.subject.toLowerCase()) ||\n alreadyInvestigated.length > 0;\n\n if (wasChecked) {\n if (!next.some((n) => n.type === 'ASK_USER')) {\n next.push({\n type: 'ASK_USER',\n target: m.subject,\n reason: `Already investigated (${Array.from(investigatedSources).join(', ')}); did not establish requested behavior. Clarification required.`,\n relativeCost: 1.0,\n expectedInfoGain: 0.9\n });\n }\n } else {\n const isFilePath = m.subject.includes('/') || m.subject.includes('.');\n next.push({\n type: isFilePath ? 'INSPECT_FILE' : 'SEARCH_REPOSITORY',\n target: m.subject,\n reason: m.reason,\n relativeCost: isFilePath ? 2.0 : 2.5,\n expectedInfoGain: 0.8\n });\n }\n }\n }\n\n // If already investigated but no ASK_USER yet, add it\n if (alreadyInvestigated.length > 0 && !next.some((n) => n.type === 'ASK_USER')) {\n next.push({\n type: 'ASK_USER',\n target: alreadyInvestigated[0].source,\n reason: `Already investigated ${alreadyInvestigated[0].source}; clarification required`,\n relativeCost: 1.0,\n expectedInfoGain: 0.9\n });\n }\n\n // If ready and no gaps -> USE_KNOWLEDGE\n if (next.length === 0 && known.length > 0) {\n next.push({\n type: 'USE_KNOWLEDGE',\n target: known[0].id,\n reason: 'Proceed with implementation using verified knowledge and constraints',\n relativeCost: 1.0,\n expectedInfoGain: 1.0\n });\n }\n\n // 10. Knowledge Impact\n const knowledgeImpact = {\n relevantKnowledge: totalRelevantKnowledge,\n validated: known.filter((k) => k.confidenceTier === 'high').length + constraints.length,\n needsRevalidation: stale.length,\n conflicted: conflictedCount,\n blockingUnknowns: unknowns.filter((u) => u.blocking).length,\n relevantFailures: pastFailures.length\n };\n\n // 11. Similar Previous Work\n const similarWork: PreflightResult['similar_work'] = [];\n for (const l of lessons) {\n similarWork.push({\n topic: l.domain || l.id,\n lesson: l.statement\n });\n }\n for (const f of pastFailures) {\n similarWork.push({\n topic: f.id,\n failure: f.statement\n });\n }\n\n // 12. Record Preflight Metric Event\n await storage.appendMetricEvent({\n type: 'preflight',\n goal,\n readiness,\n blockingUnknownsCount: knowledgeImpact.blockingUnknowns,\n staleKnowledgeCount: stale.length,\n pastFailuresCount: pastFailures.length,\n questionsCount: questions.length,\n repeatedChecksAvoidedCount: alreadyInvestigated.length,\n timestamp: Date.now()\n });\n\n return {\n goal,\n readiness,\n known,\n constraints,\n lessons,\n past_failures: pastFailures,\n unknowns,\n stale,\n missing,\n questions,\n likely_domains: likelyDomains,\n similar_work: similarWork.length > 0 ? similarWork.slice(0, 5) : undefined,\n already_investigated: alreadyInvestigated.length > 0 ? alreadyInvestigated : undefined,\n knowledge_impact: knowledgeImpact,\n next\n };\n}\n\n/**\n * Formats a PreflightResult into human-readable YAML matching the Section 4 specification.\n */\nexport function formatPreflightReport(result: PreflightResult): string {\n const plainObject: Record<string, any> = {\n goal: result.goal,\n readiness: result.readiness\n };\n\n if (result.known.length > 0) {\n plainObject.known = result.known.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier || (typeof k.confidence === 'number' ? (k.confidence >= 0.9 ? 'high' : k.confidence >= 0.7 ? 'medium' : 'low') : k.confidence)\n }));\n }\n\n if (result.constraints.length > 0) {\n plainObject.constraints = result.constraints.map((c) => ({\n id: c.id,\n statement: c.statement\n }));\n }\n\n if (result.lessons.length > 0) {\n plainObject.lessons = result.lessons.map((l) => ({\n id: l.id,\n statement: l.statement\n }));\n }\n\n if (result.past_failures.length > 0) {\n plainObject.past_failures = result.past_failures.map((f) => ({\n id: f.id,\n statement: f.statement\n }));\n }\n\n if (result.unknowns.length > 0) {\n plainObject.unknowns = result.unknowns.map((u) => ({\n id: u.id,\n question: u.question || u.statement,\n blocking: u.blocking\n }));\n }\n\n if (result.stale.length > 0) {\n plainObject.stale = result.stale.map((s) => ({\n id: s.id,\n reason: s.reason\n }));\n }\n\n if (result.questions.length > 0) {\n plainObject.questions = result.questions.map((q) => ({\n question: q.question,\n reason: q.reason\n }));\n }\n\n if (result.likely_domains.length > 0) {\n plainObject.likely_domains = result.likely_domains;\n }\n\n if (result.already_investigated && result.already_investigated.length > 0) {\n plainObject.already_investigated = result.already_investigated;\n }\n\n if (result.next.length > 0) {\n plainObject.next = result.next.map((n) => ({\n type: n.type,\n target: n.target,\n reason: n.reason\n }));\n }\n\n return YAML.stringify(plainObject);\n}\n"],"mappings":"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","names":["createHash","createHash","m","tokenize","isDecision","stat"]}
|