@seanhogg/builderforce-memory-mcp 2026.10.1 → 2026.10.2

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 CHANGED
@@ -134,7 +134,7 @@ default, so ordinary coding-agent installs never carry them in their tool list.
134
134
  | `episode_save` / `_list` / `_get` / `_forget` | Demonstrations. Screenshots go in `episodes/<id>/` and are deleted with the episode. |
135
135
  | `skill_preview` / `_compile` / `_list` / `_get` / `_forget` / `_schedule`, `skills_due` | Train Once and routines. |
136
136
  | `run_start` / `_step` / `_finish` / `_list` / `_get` | Runs and their audit trail (newest 500 kept). |
137
- | `experience_train` | Adapt the private model (`BUILDERFORCE_MEMORY_MODEL`) on every procedure it has not learned, through the engine's one adaptation recipe. The previous model is kept as `<model>.prev`. |
137
+ | `experience_train` | Adapt the private model (`BUILDERFORCE_MEMORY_MODEL`) on every procedure it has not learned, through the engine's one adaptation recipe. The previous model is kept as `<model>.prev`. Opt-in `curate: true` first leaves out procedures whose runs mostly fail and near-copies (of each other, or of the 200 most recently learned), listing each one dropped; it is reconsidered next time. |
138
138
 
139
139
  Stored beside the memory snapshot as `experience.json` (shared across processes exactly
140
140
  like `memory.json`) plus `episodes/`. Never served to a token-selected tenant of the
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,OAAO,EAA0D,MAAM,sCAAsC,CAAC;AAC5H,OAAO,EAAgB,KAAK,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+ChD,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CA6B7E;AA8BD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE,CAiPvE"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,OAAO,EAA0D,MAAM,sCAAsC,CAAC;AAC5H,OAAO,EAAgB,KAAK,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+ChD,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CA6B7E;AA8BD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE,CAsPvE"}
@@ -10,7 +10,7 @@
10
10
  import { z } from "zod";
11
11
  import { fail, okJson } from "../tool-core.js";
12
12
  import { isSafeExperienceId } from "./file-store.js";
13
- import { experienceIndex, pendingDocuments, trainExperience } from "./train.js";
13
+ import { CURATION_UNSUPPORTED, experienceIndex, pendingDocuments, trainExperience } from "./train.js";
14
14
  const DEFAULT_RUNS = 50;
15
15
  const MAX_RUNS_RETURNED = 500;
16
16
  const editsShape = z
@@ -260,7 +260,10 @@ export function buildExperienceTools(host) {
260
260
  }),
261
261
  ];
262
262
  const learnTools = [
263
- tool("experience_train", "Teach the private Evermind model the procedures it has not learned yet (each skill, and each demonstration not yet compiled into one). Pass dryRun to only count them. The previous model is kept beside the new one.", { dryRun: z.boolean().optional() }, async (args) => {
263
+ tool("experience_train", "Teach the private Evermind model the procedures it has not learned yet (each skill, and each demonstration not yet compiled into one). Pass dryRun to only count them. Pass curate to first leave out procedures whose runs mostly fail and near-copies of each other or of recently learned ones (each one left out is listed, and reconsidered next time). The previous model is kept beside the new one.", {
264
+ dryRun: z.boolean().optional(),
265
+ curate: z.boolean().optional().describe("Opt-in: filter by run quality and drop near-duplicates before training. Default false."),
266
+ }, async (args) => {
264
267
  if (!host.modelFile)
265
268
  return fail("No private Evermind model is configured (set BUILDERFORCE_MEMORY_MODEL).");
266
269
  const model = await host.loadModel();
@@ -271,7 +274,10 @@ export function buildExperienceTools(host) {
271
274
  const pending = (await pendingDocuments(store, engine, version)).length;
272
275
  return okJson({ status: "dry_run", pending, version });
273
276
  }
274
- return okJson(await trainExperience(store, engine, model, host.modelFile));
277
+ const curate = args["curate"] === true;
278
+ if (curate && (!engine.curatePendingExperience || !engine.EvermindTextEmbedder))
279
+ return fail(CURATION_UNSUPPORTED);
280
+ return okJson(await trainExperience(store, engine, model, host.modelFile, { curate }));
275
281
  }),
276
282
  ];
277
283
  return [...episodeTools, ...skillTools, ...runTools, ...learnTools];
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  * re-teaches what the discarded version had learned, and a fresh base (no suffix,
14
14
  * N = 0) — a newly downloaded Evermind — gets every procedure again.
15
15
  */
16
- import type { adaptPackage, experienceDocuments, packDocuments, ExperienceDocument, ExperienceStore } from "@seanhogg/builderforce-memory-engine";
16
+ import type { adaptPackage, curatePendingExperience, experienceDocuments, packDocuments, CurationResult, EvermindTextEmbedder, ExperienceDocument, ExperienceStore } from "@seanhogg/builderforce-memory-engine";
17
17
  import type { LoadedEvermind } from "../model/evermind-package.js";
18
18
  /** The engine functions training needs, passed in so the peer stays optional. */
19
19
  export interface TrainEngine {
@@ -21,7 +21,14 @@ export interface TrainEngine {
21
21
  packDocuments: typeof packDocuments;
22
22
  adaptPackage: typeof adaptPackage;
23
23
  EVERMIND_ADAPT_MAX_CHARS: number;
24
+ /** The opt-in curation step and the CPU embedder it scores with (engine ≥ 2026.10.2). */
25
+ curatePendingExperience?: typeof curatePendingExperience;
26
+ EvermindTextEmbedder?: typeof EvermindTextEmbedder;
24
27
  }
28
+ /** What curation left out of a pass, when it ran. */
29
+ export type CurationReport = {
30
+ dropped: CurationResult["dropped"];
31
+ };
25
32
  export type TrainOutcome = {
26
33
  status: "nothing_new";
27
34
  pending: 0;
@@ -30,10 +37,12 @@ export type TrainOutcome = {
30
37
  status: "no_window";
31
38
  pending: number;
32
39
  version: string;
40
+ curation?: CurationReport;
33
41
  } | {
34
42
  status: "curated_out";
35
43
  pending: number;
36
44
  version: string;
45
+ curation: CurationReport;
37
46
  } | {
38
47
  status: "trained";
39
48
  learned: number;
@@ -41,6 +50,7 @@ export type TrainOutcome = {
41
50
  loss: number;
42
51
  version: string;
43
52
  previousModel: string;
53
+ curation?: CurationReport;
44
54
  };
45
55
  /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
46
56
  export declare function nextExperienceVersion(version: string): string;
@@ -50,12 +60,17 @@ export declare function experienceIndex(version: string): number;
50
60
  export declare function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string): Promise<ExperienceDocument[]>;
51
61
  export interface TrainExperienceOptions {
52
62
  /**
53
- * Opt-in curation between "what is new" and the adaptation passes — typically the
54
- * engine's `curateExperience` (quality filter + near-duplicate removal, docs/ml-task-catalog.md
55
- * §4.2). Absent ⇒ every pending procedure is learned, exactly as before. A procedure
56
- * curation drops is NOT recorded as learned, so a later pass reconsiders it.
63
+ * Opt-in curation between "what is new" and the adaptation passes: the engine's
64
+ * `curatePendingExperience` (the `experience.quality` filter, trained on this
65
+ * store's run outcomes, + near-duplicate removal against the batch AND the
66
+ * recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
67
+ * model's own CPU embedder. Default false ⇒ every pending procedure is learned,
68
+ * exactly as before. A procedure curation drops is NOT recorded as learned, so a
69
+ * later pass reconsiders it.
57
70
  */
58
- curate?: (docs: ExperienceDocument[]) => Promise<ExperienceDocument[]> | ExperienceDocument[];
71
+ curate?: boolean;
59
72
  }
73
+ /** The message when curation is asked of an engine that predates it. */
74
+ export declare const CURATION_UNSUPPORTED = "Curation needs @seanhogg/builderforce-memory-engine 2026.10.2 or newer.";
60
75
  export declare function trainExperience(store: ExperienceStore, engine: TrainEngine, model: LoadedEvermind, modelFile: string, opts?: TrainExperienceOptions): Promise<TrainOutcome>;
61
76
  //# sourceMappingURL=train.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACR,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,iFAAiF;AACjF,MAAM,WAAW,WAAW;IACxB,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,YAAY,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAInH,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iCAQvG;AAED,MAAM,WAAW,sBAAsB;IACnC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC;CACjG;AAED,wBAAsB,eAAe,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,sBAA2B,GAClC,OAAO,CAAC,YAAY,CAAC,CAmCvB"}
1
+ {"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACR,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAElB,eAAe,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,iFAAiF;AACjF,MAAM,WAAW,WAAW;IACxB,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yFAAyF;IACzF,uBAAuB,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,oBAAoB,CAAC;CACtD;AAED,qDAAqD;AACrD,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,YAAY,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GACrF;IACI,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B,CAAC;AAIR,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAwBD,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iCAEvG;AAED,MAAM,WAAW,sBAAsB;IACnC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,4EAA4E,CAAC;AAE9G,wBAAsB,eAAe,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,sBAA2B,GAClC,OAAO,CAAC,YAAY,CAAC,CAgDvB"}
@@ -24,24 +24,56 @@ export function experienceIndex(version) {
24
24
  const m = EXP_SUFFIX.exec(version);
25
25
  return m ? Number(m[1]) : 0;
26
26
  }
27
- /** Procedures the model has not learned yet. */
28
- export async function pendingDocuments(store, engine, modelVersion) {
29
- const snap = await store.snapshot();
27
+ /**
28
+ * Split the procedures by what the model at `modelVersion` has learned: `pending` in
29
+ * corpus order, `known` most recently learned first (what curation de-duplicates
30
+ * against — the engine embeds only the most recent `CURATION_KNOWN_LIMIT` of them).
31
+ */
32
+ function splitDocuments(snap, engine, modelVersion) {
30
33
  const current = experienceIndex(modelVersion);
31
- const known = (id) => {
34
+ const learnedAt = (id) => {
32
35
  const n = snap.learned[id];
33
- return typeof n === "number" && n >= 1 && n <= current;
36
+ return typeof n === "number" && n >= 1 && n <= current ? n : null;
34
37
  };
35
- return engine.experienceDocuments(snap.episodes, snap.skills).filter((d) => !known(d.id));
38
+ const pending = [];
39
+ const known = [];
40
+ for (const doc of engine.experienceDocuments(snap.episodes, snap.skills)) {
41
+ const at = learnedAt(doc.id);
42
+ if (at == null)
43
+ pending.push(doc);
44
+ else
45
+ known.push({ doc, at });
46
+ }
47
+ known.sort((a, b) => b.at - a.at);
48
+ return { pending, known: known.map((k) => k.doc) };
36
49
  }
50
+ /** Procedures the model has not learned yet. */
51
+ export async function pendingDocuments(store, engine, modelVersion) {
52
+ return splitDocuments(await store.snapshot(), engine, modelVersion).pending;
53
+ }
54
+ /** The message when curation is asked of an engine that predates it. */
55
+ export const CURATION_UNSUPPORTED = "Curation needs @seanhogg/builderforce-memory-engine 2026.10.2 or newer.";
37
56
  export async function trainExperience(store, engine, model, modelFile, opts = {}) {
38
57
  const version = model.pkg.manifest.version ?? "0";
39
- const pending = await pendingDocuments(store, engine, version);
58
+ const snap = await store.snapshot();
59
+ const { pending, known } = splitDocuments(snap, engine, version);
40
60
  if (pending.length === 0)
41
61
  return { status: "nothing_new", pending: 0, version };
42
- const docs = opts.curate ? await opts.curate(pending) : pending;
62
+ let docs = pending;
63
+ let curation;
64
+ if (opts.curate) {
65
+ if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder)
66
+ throw new Error(CURATION_UNSUPPORTED);
67
+ // The model being trained embeds for curation: its own notion of "the same procedure".
68
+ const lm = model.pkg.loadLM();
69
+ const codec = model.codec;
70
+ const embedder = new engine.EvermindTextEmbedder(lm, codec);
71
+ const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
72
+ docs = r.kept;
73
+ curation = { dropped: r.dropped };
74
+ }
43
75
  if (docs.length === 0)
44
- return { status: "curated_out", pending: pending.length, version };
76
+ return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
45
77
  const next = nextExperienceVersion(version);
46
78
  // The engine's package type; the structural view is what was loaded from disk.
47
79
  let pkg = model.pkg;
@@ -58,7 +90,7 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
58
90
  learned.push(...pass.map((d) => d.id));
59
91
  }
60
92
  if (passes === 0)
61
- return { status: "no_window", pending: docs.length, version };
93
+ return { status: "no_window", pending: docs.length, version, ...(curation ? { curation } : {}) };
62
94
  const loss = lossSum / passes;
63
95
  // Keep the model this pass started from, so one bad adaptation is one rename away
64
96
  // from undone. The new model is written beside the old one and renamed into place,
@@ -70,6 +102,6 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
70
102
  model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
71
103
  model.fs.renameSync(staged, modelFile);
72
104
  await store.recordAdaptation({ index: experienceIndex(next), version: next, learned, passes, loss, at: Date.now() });
73
- return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel };
105
+ return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel, ...(curation ? { curation } : {}) };
74
106
  }
75
107
  //# sourceMappingURL=train.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanhogg/builderforce-memory-mcp",
3
- "version": "2026.10.1",
3
+ "version": "2026.10.2",
4
4
  "mcpName": "io.github.SeanHogg/builderforce-memory",
5
5
  "description": "BuilderForce Agent Memory — MCP transport. Exposes @seanhogg/builderforce-memory to any MCP client (Claude Agent SDK in-process, stdio, or HTTP) over a pluggable MemoryBackend, with token-saving fetch-on-demand recall.",
6
6
  "type": "module",
@@ -56,8 +56,8 @@
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@anthropic-ai/claude-agent-sdk": ">=0.1.0",
59
- "@seanhogg/builderforce-memory": "^2026.10.1",
60
- "@seanhogg/builderforce-memory-engine": "^2026.10.1",
59
+ "@seanhogg/builderforce-memory": "^2026.10.2",
60
+ "@seanhogg/builderforce-memory-engine": "^2026.10.2",
61
61
  "fake-indexeddb": "^6.0.0"
62
62
  },
63
63
  "peerDependenciesMeta": {
@@ -83,8 +83,8 @@
83
83
  "fake-indexeddb": "^6.0.0",
84
84
  "typescript": "^6.0.3",
85
85
  "@typescript/native-preview": "7.0.0-dev.20260627.2",
86
- "@seanhogg/builderforce-memory-engine": "2026.10.1",
87
- "@seanhogg/builderforce-memory": "2026.10.1"
86
+ "@seanhogg/builderforce-memory": "2026.10.2",
87
+ "@seanhogg/builderforce-memory-engine": "2026.10.2"
88
88
  },
89
89
  "engines": {
90
90
  "node": ">=18.0.0"
package/server.json CHANGED
@@ -8,14 +8,14 @@
8
8
  "source": "github",
9
9
  "subfolder": "packages/memory-mcp"
10
10
  },
11
- "version": "2026.10.1",
11
+ "version": "2026.10.2",
12
12
  "websiteUrl": "https://builderforce.ai",
13
13
  "packages": [
14
14
  {
15
15
  "registryType": "npm",
16
16
  "registryBaseUrl": "https://registry.npmjs.org",
17
17
  "identifier": "@seanhogg/builderforce-memory-mcp",
18
- "version": "2026.10.1",
18
+ "version": "2026.10.2",
19
19
  "transport": {
20
20
  "type": "stdio"
21
21
  },
@@ -13,7 +13,7 @@ import type { Episode, ReviewEdits, Run, RunStatus, SkillRoutine, StepOutcome }
13
13
  import { fail, okJson, type MemoryTool, type ToolResult } from "../tool-core.js";
14
14
  import { isSafeExperienceId } from "./file-store.js";
15
15
  import type { ExperienceHost } from "./host.js";
16
- import { experienceIndex, pendingDocuments, trainExperience } from "./train.js";
16
+ import { CURATION_UNSUPPORTED, experienceIndex, pendingDocuments, trainExperience } from "./train.js";
17
17
 
18
18
  const DEFAULT_RUNS = 50;
19
19
  const MAX_RUNS_RETURNED = 500;
@@ -343,8 +343,11 @@ export function buildExperienceTools(host: ExperienceHost): MemoryTool[] {
343
343
  const learnTools = [
344
344
  tool(
345
345
  "experience_train",
346
- "Teach the private Evermind model the procedures it has not learned yet (each skill, and each demonstration not yet compiled into one). Pass dryRun to only count them. The previous model is kept beside the new one.",
347
- { dryRun: z.boolean().optional() },
346
+ "Teach the private Evermind model the procedures it has not learned yet (each skill, and each demonstration not yet compiled into one). Pass dryRun to only count them. Pass curate to first leave out procedures whose runs mostly fail and near-copies of each other or of recently learned ones (each one left out is listed, and reconsidered next time). The previous model is kept beside the new one.",
347
+ {
348
+ dryRun: z.boolean().optional(),
349
+ curate: z.boolean().optional().describe("Opt-in: filter by run quality and drop near-duplicates before training. Default false."),
350
+ },
348
351
  async (args) => {
349
352
  if (!host.modelFile) return fail("No private Evermind model is configured (set BUILDERFORCE_MEMORY_MODEL).");
350
353
  const model = await host.loadModel();
@@ -354,7 +357,9 @@ export function buildExperienceTools(host: ExperienceHost): MemoryTool[] {
354
357
  const pending = (await pendingDocuments(store, engine, version)).length;
355
358
  return okJson({ status: "dry_run", pending, version });
356
359
  }
357
- return okJson(await trainExperience(store, engine, model, host.modelFile));
360
+ const curate = args["curate"] === true;
361
+ if (curate && (!engine.curatePendingExperience || !engine.EvermindTextEmbedder)) return fail(CURATION_UNSUPPORTED);
362
+ return okJson(await trainExperience(store, engine, model, host.modelFile, { curate }));
358
363
  },
359
364
  ),
360
365
  ];
@@ -1,116 +1,169 @@
1
- /**
2
- * Teach the person's private Evermind what they have done.
3
- *
4
- * Experience becomes text through the engine (`experienceDocuments`: each skill or
5
- * uncompiled demonstration as a written procedure), and the text becomes weights
6
- * through the engine's ONE adaptation recipe (`adaptPackage`). This module only
7
- * decides what is new, runs the passes over the local model file and writes the
8
- * result back, keeping the previous model beside it.
9
- *
10
- * "What is new" is the store's learned ledger. Every adaptation writes `<base>+expN`
11
- * and records N against each procedure it learned, so a loaded model trusts exactly
12
- * the entries at or below its own N: rolling back to `<model>.prev` (+exp N-1)
13
- * re-teaches what the discarded version had learned, and a fresh base (no suffix,
14
- * N = 0) — a newly downloaded Evermind — gets every procedure again.
15
- */
16
-
17
- import type {
18
- adaptPackage,
19
- experienceDocuments,
20
- packDocuments,
21
- ExperienceDocument,
22
- ExperienceStore,
23
- } from "@seanhogg/builderforce-memory-engine";
24
- import type { LoadedEvermind } from "../model/evermind-package.js";
25
-
26
- /** The engine functions training needs, passed in so the peer stays optional. */
27
- export interface TrainEngine {
28
- experienceDocuments: typeof experienceDocuments;
29
- packDocuments: typeof packDocuments;
30
- adaptPackage: typeof adaptPackage;
31
- EVERMIND_ADAPT_MAX_CHARS: number;
32
- }
33
-
34
- export type TrainOutcome =
35
- | { status: "nothing_new"; pending: 0; version: string }
36
- | { status: "no_window"; pending: number; version: string }
37
- | { status: "curated_out"; pending: number; version: string }
38
- | { status: "trained"; learned: number; passes: number; loss: number; version: string; previousModel: string };
39
-
40
- const EXP_SUFFIX = /\+exp(\d+)$/;
41
-
42
- /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
43
- export function nextExperienceVersion(version: string): string {
44
- const m = EXP_SUFFIX.exec(version);
45
- return m ? version.replace(EXP_SUFFIX, `+exp${Number(m[1]) + 1}`) : `${version}+exp1`;
46
- }
47
-
48
- /** Which adaptation produced this model: N for `+expN`, 0 for a base that has none. */
49
- export function experienceIndex(version: string): number {
50
- const m = EXP_SUFFIX.exec(version);
51
- return m ? Number(m[1]) : 0;
52
- }
53
-
54
- /** Procedures the model has not learned yet. */
55
- export async function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string) {
56
- const snap = await store.snapshot();
57
- const current = experienceIndex(modelVersion);
58
- const known = (id: string) => {
59
- const n = snap.learned[id];
60
- return typeof n === "number" && n >= 1 && n <= current;
61
- };
62
- return engine.experienceDocuments(snap.episodes, snap.skills).filter((d) => !known(d.id));
63
- }
64
-
65
- export interface TrainExperienceOptions {
66
- /**
67
- * Opt-in curation between "what is new" and the adaptation passes — typically the
68
- * engine's `curateExperience` (quality filter + near-duplicate removal, docs/ml-task-catalog.md
69
- * §4.2). Absent ⇒ every pending procedure is learned, exactly as before. A procedure
70
- * curation drops is NOT recorded as learned, so a later pass reconsiders it.
71
- */
72
- curate?: (docs: ExperienceDocument[]) => Promise<ExperienceDocument[]> | ExperienceDocument[];
73
- }
74
-
75
- export async function trainExperience(
76
- store: ExperienceStore,
77
- engine: TrainEngine,
78
- model: LoadedEvermind,
79
- modelFile: string,
80
- opts: TrainExperienceOptions = {},
81
- ): Promise<TrainOutcome> {
82
- const version = model.pkg.manifest.version ?? "0";
83
- const pending = await pendingDocuments(store, engine, version);
84
- if (pending.length === 0) return { status: "nothing_new", pending: 0, version };
85
- const docs = opts.curate ? await opts.curate(pending) : pending;
86
- if (docs.length === 0) return { status: "curated_out", pending: pending.length, version };
87
-
88
- const next = nextExperienceVersion(version);
89
- // The engine's package type; the structural view is what was loaded from disk.
90
- let pkg = model.pkg as unknown as Parameters<typeof adaptPackage>[0];
91
- const learned: string[] = [];
92
- let lossSum = 0;
93
- let passes = 0;
94
- for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
95
- const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next);
96
- if (!r) continue;
97
- pkg = r.pkg;
98
- lossSum += r.loss;
99
- passes++;
100
- learned.push(...pass.map((d) => d.id));
101
- }
102
- if (passes === 0) return { status: "no_window", pending: docs.length, version };
103
-
104
- const loss = lossSum / passes;
105
- // Keep the model this pass started from, so one bad adaptation is one rename away
106
- // from undone. The new model is written beside the old one and renamed into place,
107
- // so a crash mid-write never leaves a truncated model. The ledger is written only
108
- // after the new model is on disk.
109
- const previousModel = `${modelFile}.prev`;
110
- model.fs.copyFileSync(modelFile, previousModel);
111
- const staged = `${modelFile}.next`;
112
- model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
113
- model.fs.renameSync(staged, modelFile);
114
- await store.recordAdaptation({ index: experienceIndex(next), version: next, learned, passes, loss, at: Date.now() });
115
- return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel };
116
- }
1
+ /**
2
+ * Teach the person's private Evermind what they have done.
3
+ *
4
+ * Experience becomes text through the engine (`experienceDocuments`: each skill or
5
+ * uncompiled demonstration as a written procedure), and the text becomes weights
6
+ * through the engine's ONE adaptation recipe (`adaptPackage`). This module only
7
+ * decides what is new, runs the passes over the local model file and writes the
8
+ * result back, keeping the previous model beside it.
9
+ *
10
+ * "What is new" is the store's learned ledger. Every adaptation writes `<base>+expN`
11
+ * and records N against each procedure it learned, so a loaded model trusts exactly
12
+ * the entries at or below its own N: rolling back to `<model>.prev` (+exp N-1)
13
+ * re-teaches what the discarded version had learned, and a fresh base (no suffix,
14
+ * N = 0) — a newly downloaded Evermind — gets every procedure again.
15
+ */
16
+
17
+ import type {
18
+ adaptPackage,
19
+ curatePendingExperience,
20
+ experienceDocuments,
21
+ packDocuments,
22
+ CurationResult,
23
+ EvermindTextEmbedder,
24
+ ExperienceDocument,
25
+ ExperienceSnapshot,
26
+ ExperienceStore,
27
+ } from "@seanhogg/builderforce-memory-engine";
28
+ import type { LoadedEvermind } from "../model/evermind-package.js";
29
+
30
+ /** The engine functions training needs, passed in so the peer stays optional. */
31
+ export interface TrainEngine {
32
+ experienceDocuments: typeof experienceDocuments;
33
+ packDocuments: typeof packDocuments;
34
+ adaptPackage: typeof adaptPackage;
35
+ EVERMIND_ADAPT_MAX_CHARS: number;
36
+ /** The opt-in curation step and the CPU embedder it scores with (engine ≥ 2026.10.2). */
37
+ curatePendingExperience?: typeof curatePendingExperience;
38
+ EvermindTextEmbedder?: typeof EvermindTextEmbedder;
39
+ }
40
+
41
+ /** What curation left out of a pass, when it ran. */
42
+ export type CurationReport = { dropped: CurationResult["dropped"] };
43
+
44
+ export type TrainOutcome =
45
+ | { status: "nothing_new"; pending: 0; version: string }
46
+ | { status: "no_window"; pending: number; version: string; curation?: CurationReport }
47
+ | { status: "curated_out"; pending: number; version: string; curation: CurationReport }
48
+ | {
49
+ status: "trained";
50
+ learned: number;
51
+ passes: number;
52
+ loss: number;
53
+ version: string;
54
+ previousModel: string;
55
+ curation?: CurationReport;
56
+ };
57
+
58
+ const EXP_SUFFIX = /\+exp(\d+)$/;
59
+
60
+ /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
61
+ export function nextExperienceVersion(version: string): string {
62
+ const m = EXP_SUFFIX.exec(version);
63
+ return m ? version.replace(EXP_SUFFIX, `+exp${Number(m[1]) + 1}`) : `${version}+exp1`;
64
+ }
65
+
66
+ /** Which adaptation produced this model: N for `+expN`, 0 for a base that has none. */
67
+ export function experienceIndex(version: string): number {
68
+ const m = EXP_SUFFIX.exec(version);
69
+ return m ? Number(m[1]) : 0;
70
+ }
71
+
72
+ /**
73
+ * Split the procedures by what the model at `modelVersion` has learned: `pending` in
74
+ * corpus order, `known` most recently learned first (what curation de-duplicates
75
+ * against — the engine embeds only the most recent `CURATION_KNOWN_LIMIT` of them).
76
+ */
77
+ function splitDocuments(snap: ExperienceSnapshot, engine: TrainEngine, modelVersion: string) {
78
+ const current = experienceIndex(modelVersion);
79
+ const learnedAt = (id: string): number | null => {
80
+ const n = snap.learned[id];
81
+ return typeof n === "number" && n >= 1 && n <= current ? n : null;
82
+ };
83
+ const pending: ExperienceDocument[] = [];
84
+ const known: { doc: ExperienceDocument; at: number }[] = [];
85
+ for (const doc of engine.experienceDocuments(snap.episodes, snap.skills)) {
86
+ const at = learnedAt(doc.id);
87
+ if (at == null) pending.push(doc);
88
+ else known.push({ doc, at });
89
+ }
90
+ known.sort((a, b) => b.at - a.at);
91
+ return { pending, known: known.map((k) => k.doc) };
92
+ }
93
+
94
+ /** Procedures the model has not learned yet. */
95
+ export async function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string) {
96
+ return splitDocuments(await store.snapshot(), engine, modelVersion).pending;
97
+ }
98
+
99
+ export interface TrainExperienceOptions {
100
+ /**
101
+ * Opt-in curation between "what is new" and the adaptation passes: the engine's
102
+ * `curatePendingExperience` (the `experience.quality` filter, trained on this
103
+ * store's run outcomes, + near-duplicate removal against the batch AND the
104
+ * recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
105
+ * model's own CPU embedder. Default false ⇒ every pending procedure is learned,
106
+ * exactly as before. A procedure curation drops is NOT recorded as learned, so a
107
+ * later pass reconsiders it.
108
+ */
109
+ curate?: boolean;
110
+ }
111
+
112
+ /** The message when curation is asked of an engine that predates it. */
113
+ export const CURATION_UNSUPPORTED = "Curation needs @seanhogg/builderforce-memory-engine 2026.10.2 or newer.";
114
+
115
+ export async function trainExperience(
116
+ store: ExperienceStore,
117
+ engine: TrainEngine,
118
+ model: LoadedEvermind,
119
+ modelFile: string,
120
+ opts: TrainExperienceOptions = {},
121
+ ): Promise<TrainOutcome> {
122
+ const version = model.pkg.manifest.version ?? "0";
123
+ const snap = await store.snapshot();
124
+ const { pending, known } = splitDocuments(snap, engine, version);
125
+ if (pending.length === 0) return { status: "nothing_new", pending: 0, version };
126
+
127
+ let docs = pending;
128
+ let curation: CurationReport | undefined;
129
+ if (opts.curate) {
130
+ if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder) throw new Error(CURATION_UNSUPPORTED);
131
+ // The model being trained embeds for curation: its own notion of "the same procedure".
132
+ const lm = model.pkg.loadLM() as ConstructorParameters<typeof EvermindTextEmbedder>[0];
133
+ const codec = model.codec as ConstructorParameters<typeof EvermindTextEmbedder>[1];
134
+ const embedder = new engine.EvermindTextEmbedder(lm, codec);
135
+ const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
136
+ docs = r.kept;
137
+ curation = { dropped: r.dropped };
138
+ }
139
+ if (docs.length === 0) return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
140
+
141
+ const next = nextExperienceVersion(version);
142
+ // The engine's package type; the structural view is what was loaded from disk.
143
+ let pkg = model.pkg as unknown as Parameters<typeof adaptPackage>[0];
144
+ const learned: string[] = [];
145
+ let lossSum = 0;
146
+ let passes = 0;
147
+ for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
148
+ const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next);
149
+ if (!r) continue;
150
+ pkg = r.pkg;
151
+ lossSum += r.loss;
152
+ passes++;
153
+ learned.push(...pass.map((d) => d.id));
154
+ }
155
+ if (passes === 0) return { status: "no_window", pending: docs.length, version, ...(curation ? { curation } : {}) };
156
+
157
+ const loss = lossSum / passes;
158
+ // Keep the model this pass started from, so one bad adaptation is one rename away
159
+ // from undone. The new model is written beside the old one and renamed into place,
160
+ // so a crash mid-write never leaves a truncated model. The ledger is written only
161
+ // after the new model is on disk.
162
+ const previousModel = `${modelFile}.prev`;
163
+ model.fs.copyFileSync(modelFile, previousModel);
164
+ const staged = `${modelFile}.next`;
165
+ model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
166
+ model.fs.renameSync(staged, modelFile);
167
+ await store.recordAdaptation({ index: experienceIndex(next), version: next, learned, passes, loss, at: Date.now() });
168
+ return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel, ...(curation ? { curation } : {}) };
169
+ }