@tangle-network/agent-knowledge 1.3.0 → 1.5.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/LICENSE ADDED
@@ -0,0 +1,43 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tangle Network
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+ *** Add File: /home/drew/worktrees/publish-open-source/modal-inference-blueprint/LICENSE-MIT
23
+ MIT License
24
+
25
+ Copyright (c) 2026 Tangle Network
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining a copy
28
+ of this software and associated documentation files (the "Software"), to deal
29
+ in the Software without restriction, including without limitation the rights
30
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
+ copies of the Software, and to permit persons to whom the Software is
32
+ furnished to do so, subject to the following conditions:
33
+
34
+ The above copyright notice and this permission notice shall be included in all
35
+ copies or substantial portions of the Software.
36
+
37
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43
+ SOFTWARE.
package/README.md CHANGED
@@ -199,6 +199,66 @@ await runAgentControlLoop({
199
199
  })
200
200
  ```
201
201
 
202
+ ## Researcher profile
203
+
204
+ `@tangle-network/agent-knowledge/profiles` ships a sandbox-SDK
205
+ `AgentProfile` preset for source-grounded research agents. Pairs with
206
+ `runLoop` from `@tangle-network/agent-runtime/loops` — the profile owns
207
+ the prompt + output adapter + validator; the kernel owns iteration,
208
+ concurrency, cost, and trace emission.
209
+
210
+ ```ts
211
+ import { runLoop } from '@tangle-network/agent-runtime/loops'
212
+ import { multiHarnessResearcherFanout } from '@tangle-network/agent-knowledge/profiles'
213
+
214
+ const research = multiHarnessResearcherFanout({
215
+ harnesses: ['opencode/zai-coding-plan/glm-5.1', 'claude-code', 'codex'],
216
+ })
217
+
218
+ const result = await runLoop({
219
+ driver: research.driver,
220
+ agentRuns: research.agentRuns,
221
+ output: research.output,
222
+ validator: research.validator,
223
+ task: {
224
+ question: 'What content does cpg-founder ICP engage with on Twitter?',
225
+ knowledgeNamespace: 'cust_42',
226
+ sources: ['twitter', 'web'],
227
+ maxItems: 20,
228
+ minConfidence: 0.6,
229
+ },
230
+ ctx: { sandboxClient },
231
+ })
232
+
233
+ if (result.winner?.verdict?.valid) {
234
+ // result.winner.output.proposedWrites: KnowledgeUpdate[]
235
+ // The profile does NOT materialize. Decide whether to apply.
236
+ for (const write of result.winner.output.proposedWrites) {
237
+ // route through applyKnowledgeWriteBlocks / a KbStore put when ready
238
+ }
239
+ }
240
+ ```
241
+
242
+ Three invariants are enforced by the validator:
243
+
244
+ - **Namespace isolation** — every `KnowledgeItem` + `KnowledgeUpdate`
245
+ must carry `task.knowledgeNamespace`. Cross-tenant writes hard-fail.
246
+ - **Provenance** — every item carries at least one evidence entry.
247
+ - **Citation density** — quotes-with-source / items >= 0.7 by default.
248
+
249
+ Validator scoring (default; overridable):
250
+
251
+ ```
252
+ score = 0.4 · citation_density
253
+ + 0.2 · source_diversity
254
+ + 0.2 · recency_match
255
+ + 0.2 · gap_coverage
256
+ ```
257
+
258
+ The output preserves agent intelligence — `items`, `citations`,
259
+ `proposedWrites` are typed; `gaps`, `notes`, and any extras the agent
260
+ emitted land in `raw` rather than getting dropped.
261
+
202
262
  ## Pluggable Knowledge Sources
203
263
 
204
264
  Static knowledge rots. Authorities like Cornell LII, the IRS, and state
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { S as SourceRecord, c as KnowledgeIndex, d as KnowledgeSearchResult, e as KnowledgeEventType, f as KnowledgeEvent, g as KnowledgePage, b as KnowledgeGraph, h as KnowledgeLintFinding, i as KnowledgeBaseCandidate, j as KnowledgeWriteBlock, k as KnowledgeClaim, l as KnowledgeRelease, m as SourceRegistry, n as KnowledgeWriteParseResult } from './types-CAeh7Lwb.js';
2
- export { C as ClaimRef, K as KnowledgeGraphEdge, a as KnowledgeGraphNode, o as KnowledgeId, p as KnowledgePolicy, q as KnowledgeRelation, r as KnowledgeUnit, s as SourceAnchor } from './types-CAeh7Lwb.js';
1
+ import { S as SourceRecord, c as KnowledgeIndex, d as KnowledgeSearchResult, e as KnowledgeEventType, f as KnowledgeEvent, g as KnowledgePage, b as KnowledgeGraph, h as KnowledgeLintFinding, i as KnowledgeWriteBlock, j as KnowledgeClaim, k as KnowledgeRelease, l as SourceRegistry, m as KnowledgeWriteParseResult } from './types-BEDGlXB-.js';
2
+ export { C as ClaimRef, n as KnowledgeBaseCandidate, K as KnowledgeGraphEdge, a as KnowledgeGraphNode, o as KnowledgeId, p as KnowledgePolicy, q as KnowledgeRelation, r as KnowledgeUnit, s as SourceAnchor } from './types-BEDGlXB-.js';
3
3
  import { KnowledgeFragment } from './sources/index.js';
4
4
  export { CornellLiiSelector, CornellLiiSourceOptions, FetchOpts, FragmentProvenance, IRS_DIMENSION_HINTS, IrsPublicationsSourceOptions, KnowledgeSource, MAX_RESPONSE_BYTES, MIN_REQUEST_GAP_MS, POLITE_USER_AGENT, PoliteFetchOptions, PoliteFetchResult, StateSosEntity, StateSosSourceConfig, __resetHttpThrottle, createCornellLiiSource, createIrsPublicationsSource, createStateSosSource, extractLinks, firstMatch, htmlToText, innerHtmlById, looksLikeBlockPage, politeFetch } from './sources/index.js';
5
- import { KnowledgeRequirementCategory, KnowledgeAcquisitionMode, KnowledgeImportance, KnowledgeFreshness, KnowledgeSensitivity, KnowledgeRequirement, KnowledgeBundle, KnowledgeReadinessReport, UserQuestion, DataAcquisitionPlan, MultiShotVariant, MultiShotOptimizationConfig, MultiShotRunner, MultiShotScorer, MultiShotMutateAdapter, MultiShotOptimizationResult, AnalystSeverity, AnalystFinding, ReleaseConfidenceScorecard, RunRecord, ControlRuntimeConfig, ControlEvalResult } from '@tangle-network/agent-eval';
5
+ import { KnowledgeRequirementCategory, KnowledgeAcquisitionMode, KnowledgeImportance, KnowledgeFreshness, KnowledgeSensitivity, KnowledgeRequirement, KnowledgeBundle, KnowledgeReadinessReport, UserQuestion, DataAcquisitionPlan, AnalystSeverity, AnalystFinding, RunRecord, ReleaseTraceEvidence, GateDecision, ReleaseConfidenceScorecard, ControlRuntimeConfig, ControlEvalResult } from '@tangle-network/agent-eval';
6
6
  import { z } from 'zod';
7
7
 
8
8
  interface SourceAdapterInput {
@@ -471,20 +471,6 @@ declare class FileSystemKbStore extends MemoryKbStore {
471
471
 
472
472
  declare function lintKnowledgeIndex(index: KnowledgeIndex): KnowledgeLintFinding[];
473
473
 
474
- type KnowledgeBaseVariant = MultiShotVariant<KnowledgeBaseCandidate>;
475
- interface KnowledgeOptimizationConfig extends Omit<MultiShotOptimizationConfig<KnowledgeBaseCandidate>, 'runner' | 'scorer' | 'mutateAdapter' | 'target'> {
476
- target?: string;
477
- runner: MultiShotRunner<KnowledgeBaseCandidate>;
478
- scorer: MultiShotScorer<KnowledgeBaseCandidate>;
479
- mutateAdapter: MultiShotMutateAdapter<KnowledgeBaseCandidate>;
480
- }
481
- declare function runKnowledgeBaseOptimization(config: KnowledgeOptimizationConfig): Promise<MultiShotOptimizationResult<KnowledgeBaseCandidate>>;
482
- declare function knowledgeVariantFromCandidate(candidate: KnowledgeBaseCandidate, options?: {
483
- id?: string;
484
- label?: string;
485
- generation?: number;
486
- }): KnowledgeBaseVariant;
487
-
488
474
  interface ApplyWriteBlocksResult {
489
475
  written: string[];
490
476
  warnings: string[];
@@ -584,11 +570,30 @@ interface KnowledgeReleaseReport {
584
570
  candidateRuns: RunRecord[];
585
571
  baselineRuns: RunRecord[];
586
572
  }
587
- declare function knowledgeReleaseReportFromOptimization(result: MultiShotOptimizationResult<KnowledgeBaseCandidate>, options?: {
588
- runRecords?: RunRecord[];
573
+ /**
574
+ * Campaign-native release report. The caller (a consumer's KB self-improvement
575
+ * loop) supplies the candidate/baseline `RunRecord[]` (e.g. via
576
+ * `campaignToRunRecords`) + optional per-instance `ReleaseTraceEvidence` + the
577
+ * gate decision; this folds them into a `ReleaseConfidenceScorecard` + a
578
+ * `KnowledgeRelease`. Decoupled from any optimizer result shape — agent-eval's
579
+ * legacy multi-shot orchestration (and its `MultiShotOptimizationResult`) was
580
+ * removed in 0.42; release confidence is computed from records + traces.
581
+ */
582
+ interface KnowledgeReleaseInput {
583
+ candidateId: string;
584
+ baselineId?: string;
585
+ candidateRuns: RunRecord[];
586
+ baselineRuns?: RunRecord[];
587
+ traces?: ReleaseTraceEvidence[];
588
+ gateDecision?: GateDecision | null;
589
+ /** True when a held-out split was evaluated (drives the holdout threshold). */
590
+ hasHoldout?: boolean;
591
+ /** Candidate is the search-best variant — a promotion precondition. Default true. */
592
+ promotedIsBest?: boolean;
589
593
  createdAt?: string;
590
594
  minScore?: number;
591
- }): KnowledgeReleaseReport;
595
+ }
596
+ declare function knowledgeReleaseReport(input: KnowledgeReleaseInput): KnowledgeReleaseReport;
592
597
 
593
598
  interface AddSourceOptions {
594
599
  copyIntoRaw?: boolean;
@@ -928,4 +933,4 @@ declare function normalizeLinkTarget(target: string): string;
928
933
  declare function isSafeKnowledgePath(path: string, allowedPrefixes?: string[]): boolean;
929
934
  declare function parseKnowledgeWriteBlocks(text: string, allowedPrefixes?: string[]): KnowledgeWriteParseResult;
930
935
 
931
- export { type AddSourceOptions, type AddSourceTextInput, type ApplyWriteBlocksResult, type BuildEvalKnowledgeBundleOptions, type ChunkingOptions, type D1Adapter, type DefineReadinessSpecInput, type DetectChangesOptions, type DetectChangesResult, type DiscoveryResult, type DiscoveryTask, type EvalKnowledgeBundleBuildResult, type FileSystemFreshnessStoreOptions, FileSystemKbStore, type FreshnessKey, type FreshnessMark, type FreshnessRecord, type FreshnessTtl, type KbStore, KnowledgeBaseCandidate, KnowledgeBaseCandidateSchema, type KnowledgeBaseVariant, type KnowledgeChange, type KnowledgeChangeKind, type KnowledgeChunk, KnowledgeClaim, type KnowledgeControlLoopAction, type KnowledgeControlLoopActionResult, type KnowledgeControlLoopAdapter, type KnowledgeControlLoopAdapterOptions, type KnowledgeControlLoopState, type KnowledgeDiscoveryDispatcher, type KnowledgeDiscoveryWorker, KnowledgeEvent, type KnowledgeEventQuery, KnowledgeEventSchema, KnowledgeEventType, type KnowledgeExplanation, KnowledgeFragment, type KnowledgeFreshnessStore, KnowledgeGraph, KnowledgeGraphEdgeSchema, KnowledgeGraphNodeSchema, KnowledgeIndex, KnowledgeIndexSchema, type KnowledgeInspection, type KnowledgeLayout, KnowledgeLintFinding, type KnowledgeOptimizationConfig, KnowledgePage, KnowledgePageSchema, type KnowledgeProposal, KnowledgeProposalParseError, type KnowledgeReadinessSpec, KnowledgeRelease, type KnowledgeReleaseReport, type KnowledgeResearchLoopContext, type KnowledgeResearchLoopDecision, type KnowledgeResearchLoopResult, type KnowledgeResearchLoopStep, KnowledgeSearchResult, KnowledgeWriteBlock, KnowledgeWriteParseResult, MemoryKbStore, type ParsedFrontmatter, type ProposeFromFindingsResult, READINESS_SPEC_DEFAULTS, type RunKnowledgeResearchLoopOptions, SCAFFOLD_PAGE_BASENAMES, type SourceAdapter, type SourceAdapterInput, type SourceAdapterOutput, SourceAnchorSchema, type SourceFreshnessInspection, SourceRecord, SourceRecordSchema, SourceRegistry, type ValidateKnowledgeOptions, type ValidateKnowledgeResult, WIKILINK_REGEX, addSourcePath, addSourceText, applyKnowledgeWriteBlocks, applyKnowledgeWriteBlocksFile, buildEvalKnowledgeBundle, buildKnowledgeGraph, buildKnowledgeIndex, chunkMarkdown, createD1FreshnessStoreStub, createFileSystemFreshnessStore, createKnowledgeControlLoopAdapter, createKnowledgeEvent, createLocalDiscoveryDispatcher, defineReadinessSpec, detectChanges, explainKnowledgeTarget, extractWikilinks, formatFrontmatter, initKnowledgeBase, inspectKnowledgeIndex, isSafeKnowledgePath, isScaffoldPath, knowledgeReleaseReportFromOptimization, knowledgeVariantFromCandidate, layoutFor, lintKnowledgeIndex, loadKnowledgePages, loadSourceRegistry, mediaTypeFor, normalizeLinkTarget, parseFrontmatter, parseKnowledgeWriteBlocks, proposeFromFinding, proposeFromFindings, reciprocalRankFusion, runKnowledgeBaseOptimization, runKnowledgeResearchLoop, searchKnowledge, sha256, slugify, sourceRegistryPath, stableId, stripFrontmatter, textSourceAdapter, tokenizeQuery, validateKnowledgeIndex, writeJson, writeKnowledgeIndex, writeSourceRegistry };
936
+ export { type AddSourceOptions, type AddSourceTextInput, type ApplyWriteBlocksResult, type BuildEvalKnowledgeBundleOptions, type ChunkingOptions, type D1Adapter, type DefineReadinessSpecInput, type DetectChangesOptions, type DetectChangesResult, type DiscoveryResult, type DiscoveryTask, type EvalKnowledgeBundleBuildResult, type FileSystemFreshnessStoreOptions, FileSystemKbStore, type FreshnessKey, type FreshnessMark, type FreshnessRecord, type FreshnessTtl, type KbStore, KnowledgeBaseCandidateSchema, type KnowledgeChange, type KnowledgeChangeKind, type KnowledgeChunk, KnowledgeClaim, type KnowledgeControlLoopAction, type KnowledgeControlLoopActionResult, type KnowledgeControlLoopAdapter, type KnowledgeControlLoopAdapterOptions, type KnowledgeControlLoopState, type KnowledgeDiscoveryDispatcher, type KnowledgeDiscoveryWorker, KnowledgeEvent, type KnowledgeEventQuery, KnowledgeEventSchema, KnowledgeEventType, type KnowledgeExplanation, KnowledgeFragment, type KnowledgeFreshnessStore, KnowledgeGraph, KnowledgeGraphEdgeSchema, KnowledgeGraphNodeSchema, KnowledgeIndex, KnowledgeIndexSchema, type KnowledgeInspection, type KnowledgeLayout, KnowledgeLintFinding, KnowledgePage, KnowledgePageSchema, type KnowledgeProposal, KnowledgeProposalParseError, type KnowledgeReadinessSpec, KnowledgeRelease, type KnowledgeReleaseInput, type KnowledgeReleaseReport, type KnowledgeResearchLoopContext, type KnowledgeResearchLoopDecision, type KnowledgeResearchLoopResult, type KnowledgeResearchLoopStep, KnowledgeSearchResult, KnowledgeWriteBlock, KnowledgeWriteParseResult, MemoryKbStore, type ParsedFrontmatter, type ProposeFromFindingsResult, READINESS_SPEC_DEFAULTS, type RunKnowledgeResearchLoopOptions, SCAFFOLD_PAGE_BASENAMES, type SourceAdapter, type SourceAdapterInput, type SourceAdapterOutput, SourceAnchorSchema, type SourceFreshnessInspection, SourceRecord, SourceRecordSchema, SourceRegistry, type ValidateKnowledgeOptions, type ValidateKnowledgeResult, WIKILINK_REGEX, addSourcePath, addSourceText, applyKnowledgeWriteBlocks, applyKnowledgeWriteBlocksFile, buildEvalKnowledgeBundle, buildKnowledgeGraph, buildKnowledgeIndex, chunkMarkdown, createD1FreshnessStoreStub, createFileSystemFreshnessStore, createKnowledgeControlLoopAdapter, createKnowledgeEvent, createLocalDiscoveryDispatcher, defineReadinessSpec, detectChanges, explainKnowledgeTarget, extractWikilinks, formatFrontmatter, initKnowledgeBase, inspectKnowledgeIndex, isSafeKnowledgePath, isScaffoldPath, knowledgeReleaseReport, layoutFor, lintKnowledgeIndex, loadKnowledgePages, loadSourceRegistry, mediaTypeFor, normalizeLinkTarget, parseFrontmatter, parseKnowledgeWriteBlocks, proposeFromFinding, proposeFromFindings, reciprocalRankFusion, runKnowledgeResearchLoop, searchKnowledge, sha256, slugify, sourceRegistryPath, stableId, stripFrontmatter, textSourceAdapter, tokenizeQuery, validateKnowledgeIndex, writeJson, writeKnowledgeIndex, writeSourceRegistry };
package/dist/index.js CHANGED
@@ -615,25 +615,6 @@ function clone(value) {
615
615
  return value == null ? value : JSON.parse(JSON.stringify(value));
616
616
  }
617
617
 
618
- // src/optimization.ts
619
- import {
620
- runMultiShotOptimization
621
- } from "@tangle-network/agent-eval";
622
- async function runKnowledgeBaseOptimization(config) {
623
- return runMultiShotOptimization({
624
- ...config,
625
- target: config.target ?? "agent-knowledge-base"
626
- });
627
- }
628
- function knowledgeVariantFromCandidate(candidate, options = {}) {
629
- return {
630
- id: options.id ?? candidate.id,
631
- label: options.label ?? candidate.id,
632
- generation: options.generation ?? 0,
633
- payload: candidate
634
- };
635
- }
636
-
637
618
  // src/propose-from-finding.ts
638
619
  var KnowledgeProposalParseError = class extends Error {
639
620
  constructor(findingId, subject, message) {
@@ -831,50 +812,35 @@ function humanize(slug) {
831
812
  // src/release.ts
832
813
  import {
833
814
  evaluateReleaseConfidence,
834
- releaseTraceEvidenceFromMultiShotTrials,
835
815
  validateRunRecord
836
816
  } from "@tangle-network/agent-eval";
837
- function knowledgeReleaseReportFromOptimization(result, options = {}) {
838
- const trials = result.evolution.generations.flatMap(
839
- (generation) => generation.trials
840
- );
841
- const traceEvidence = releaseTraceEvidenceFromMultiShotTrials(trials);
842
- const runRecords = (options.runRecords ?? [
843
- ...result.gate?.candidateRuns ?? [],
844
- ...result.gate?.baselineRuns ?? []
845
- ]).map(validateRunRecord);
817
+ function knowledgeReleaseReport(input) {
818
+ const baselineRuns = input.baselineRuns ?? [];
819
+ const runRecords = [...input.candidateRuns, ...baselineRuns].map(validateRunRecord);
846
820
  const scorecard = evaluateReleaseConfidence({
847
821
  target: "agent-knowledge-base",
848
- candidateId: result.promotedVariant.id,
849
- baselineId: "baseline",
850
- traces: traceEvidence,
822
+ candidateId: input.candidateId,
823
+ baselineId: input.baselineId ?? "baseline",
824
+ traces: input.traces ?? [],
851
825
  runs: runRecords,
852
- gateDecision: result.gate?.decision ?? null,
826
+ gateDecision: input.gateDecision ?? null,
853
827
  thresholds: {
854
828
  requireCorpus: false,
855
- requireHoldout: Boolean(result.gate),
856
- minHoldoutRuns: result.gate ? 1 : 0,
829
+ requireHoldout: input.hasHoldout ?? false,
830
+ minHoldoutRuns: input.hasHoldout ? 1 : 0,
857
831
  minSearchRuns: 1,
858
- minMeanScore: options.minScore ?? 0.7
832
+ minMeanScore: input.minScore ?? 0.7
859
833
  }
860
834
  });
861
835
  const release = {
862
- id: stableId(
863
- "krel",
864
- `${result.promotedVariant.id}:${options.createdAt ?? (/* @__PURE__ */ new Date()).toISOString()}`
865
- ),
866
- candidateId: result.promotedVariant.id,
867
- createdAt: options.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
868
- promoted: scorecard.status !== "fail" && result.promotedVariant.id === result.searchBestVariant.id,
836
+ id: stableId("krel", `${input.candidateId}:${input.createdAt ?? (/* @__PURE__ */ new Date()).toISOString()}`),
837
+ candidateId: input.candidateId,
838
+ createdAt: input.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
839
+ promoted: scorecard.status !== "fail" && (input.promotedIsBest ?? true),
869
840
  scorecard,
870
841
  runRecordIds: runRecords.map((record) => record.runId)
871
842
  };
872
- return {
873
- release,
874
- scorecard,
875
- candidateRuns: result.gate?.candidateRuns ?? [],
876
- baselineRuns: result.gate?.baselineRuns ?? []
877
- };
843
+ return { release, scorecard, candidateRuns: input.candidateRuns, baselineRuns };
878
844
  }
879
845
 
880
846
  // src/research-loop.ts
@@ -1086,8 +1052,7 @@ export {
1086
1052
  inspectKnowledgeIndex,
1087
1053
  isSafeKnowledgePath,
1088
1054
  isScaffoldPath,
1089
- knowledgeReleaseReportFromOptimization,
1090
- knowledgeVariantFromCandidate,
1055
+ knowledgeReleaseReport,
1091
1056
  layoutFor,
1092
1057
  lintKnowledgeIndex,
1093
1058
  loadKnowledgePages,
@@ -1101,7 +1066,6 @@ export {
1101
1066
  proposeFromFinding,
1102
1067
  proposeFromFindings,
1103
1068
  reciprocalRankFusion,
1104
- runKnowledgeBaseOptimization,
1105
1069
  runKnowledgeResearchLoop,
1106
1070
  searchKnowledge,
1107
1071
  sha256,