@seanhogg/builderforce-memory-mcp 2026.10.1 → 2026.10.3

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
@@ -8,7 +8,7 @@
8
8
  * implementation, so the freshness check and the loop guard are the memory store's),
9
9
  * and each episode's screenshots live in `episodes/<id>/`, removed when it is forgotten.
10
10
  */
11
- import type { Adaptation, Episode, EpisodeSummary, ExperienceSnapshot, ExperienceStore, InMemoryExperienceStore, Run, RunStepLog, Skill } from "@seanhogg/builderforce-memory-engine";
11
+ import type { Adaptation, CurationRecord, Episode, EpisodeSummary, ExperienceSnapshot, ExperienceStore, InMemoryExperienceStore, Run, RunStepLog, Skill } from "@seanhogg/builderforce-memory-engine";
12
12
  import type { SharedJsonFile } from "../persistence/shared-json-file.js";
13
13
  /** The filesystem calls the store makes besides the snapshot's own. */
14
14
  export interface EpisodeFolders {
@@ -46,6 +46,7 @@ export declare class FileExperienceStore implements ExperienceStore {
46
46
  getRun(id: string): Promise<Run | undefined>;
47
47
  listRuns(limit: number): Promise<Run[]>;
48
48
  recordAdaptation(adaptation: Adaptation): Promise<void>;
49
+ recordCuration(curation: CurationRecord): Promise<void>;
49
50
  snapshot(): Promise<ExperienceSnapshot>;
50
51
  clear(): Promise<void>;
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,GAAG,EACH,UAAU,EACV,KAAK,EACR,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,kBAAkB,EAC3C,OAAO,EAAE,cAAc;IAG5C;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAsBP,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAI5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKvC,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,GAAG,EACH,UAAU,EACV,KAAK,EACR,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,kBAAkB,EAC3C,OAAO,EAAE,cAAc;IAG5C;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAsBP,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAI5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKvC,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
@@ -104,6 +104,10 @@ export class FileExperienceStore {
104
104
  this.fresh();
105
105
  await this.inner.recordAdaptation(adaptation);
106
106
  }
107
+ async recordCuration(curation) {
108
+ this.fresh();
109
+ await this.inner.recordCuration(curation);
110
+ }
107
111
  async snapshot() {
108
112
  this.fresh();
109
113
  return this.inner.snapshot();
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"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"}
@@ -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, curationRecords, 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,21 @@ 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;
27
+ /** The `curated_out` records to persist for a curation (engine ≥ 2026.10.3). */
28
+ curationRecords?: typeof curationRecords;
24
29
  }
30
+ /**
31
+ * What curation left out of a pass, when it ran: `dropped` this call, and
32
+ * `alreadyDropped` — left out by an earlier call, verdict still standing, so skipped
33
+ * without being embedded again.
34
+ */
35
+ export type CurationReport = {
36
+ dropped: CurationResult["dropped"];
37
+ alreadyDropped?: CurationResult["dropped"];
38
+ };
25
39
  export type TrainOutcome = {
26
40
  status: "nothing_new";
27
41
  pending: 0;
@@ -30,10 +44,12 @@ export type TrainOutcome = {
30
44
  status: "no_window";
31
45
  pending: number;
32
46
  version: string;
47
+ curation?: CurationReport;
33
48
  } | {
34
49
  status: "curated_out";
35
50
  pending: number;
36
51
  version: string;
52
+ curation: CurationReport;
37
53
  } | {
38
54
  status: "trained";
39
55
  learned: number;
@@ -41,6 +57,7 @@ export type TrainOutcome = {
41
57
  loss: number;
42
58
  version: string;
43
59
  previousModel: string;
60
+ curation?: CurationReport;
44
61
  };
45
62
  /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
46
63
  export declare function nextExperienceVersion(version: string): string;
@@ -50,12 +67,19 @@ export declare function experienceIndex(version: string): number;
50
67
  export declare function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string): Promise<ExperienceDocument[]>;
51
68
  export interface TrainExperienceOptions {
52
69
  /**
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.
70
+ * Opt-in curation between "what is new" and the adaptation passes: the engine's
71
+ * `curatePendingExperience` (the `experience.quality` filter, trained on this
72
+ * store's run outcomes, + near-duplicate removal against the batch AND the
73
+ * recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
74
+ * model's own CPU embedder. Default false ⇒ every pending procedure is learned,
75
+ * exactly as before. A procedure curation drops is NOT recorded as learned; it is
76
+ * recorded as `curated_out` (with the id it duplicates, or its quality score), and
77
+ * later curations skip it while that verdict stands — a duplicate until what it
78
+ * repeats is no longer learned, a low-quality one until it has new runs.
57
79
  */
58
- curate?: (docs: ExperienceDocument[]) => Promise<ExperienceDocument[]> | ExperienceDocument[];
80
+ curate?: boolean;
59
81
  }
82
+ /** The message when curation is asked of an engine that predates it. */
83
+ export declare const CURATION_UNSUPPORTED = "Curation needs @seanhogg/builderforce-memory-engine 2026.10.2 or newer.";
60
84
  export declare function trainExperience(store: ExperienceStore, engine: TrainEngine, model: LoadedEvermind, modelFile: string, opts?: TrainExperienceOptions): Promise<TrainOutcome>;
61
85
  //# 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,eAAe,EACf,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;IACnD,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,eAAe,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAAC,cAAc,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;CAAE,CAAC;AAEhH,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;;;;;;;;;;OAUG;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,CAwDvB"}
@@ -24,24 +24,62 @@ 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
+ /** The LM curation embedded with — untrained, loaded from `model.pkg` — reused by the first pass. */
65
+ let curationLm;
66
+ if (opts.curate) {
67
+ if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder)
68
+ throw new Error(CURATION_UNSUPPORTED);
69
+ // The model being trained embeds for curation: its own notion of "the same procedure".
70
+ // Embedding never changes its weights, so the same LM is the first pass's copy.
71
+ curationLm = model.pkg.loadLM();
72
+ const codec = model.codec;
73
+ const embedder = new engine.EvermindTextEmbedder(curationLm, codec);
74
+ const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
75
+ docs = r.kept;
76
+ curation = { dropped: r.dropped, ...(r.alreadyDropped?.length ? { alreadyDropped: r.alreadyDropped } : {}) };
77
+ // Persist the verdicts, so the next call skips these instead of re-embedding them.
78
+ if (engine.curationRecords)
79
+ await store.recordCuration(engine.curationRecords(r, snap, Date.now()));
80
+ }
43
81
  if (docs.length === 0)
44
- return { status: "curated_out", pending: pending.length, version };
82
+ return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
45
83
  const next = nextExperienceVersion(version);
46
84
  // The engine's package type; the structural view is what was loaded from disk.
47
85
  let pkg = model.pkg;
@@ -49,16 +87,19 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
49
87
  let lossSum = 0;
50
88
  let passes = 0;
51
89
  for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
52
- const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next);
90
+ // Until a pass succeeds `pkg` is still `model.pkg`, so curation's untrained LM is its copy.
91
+ const lm = pkg === model.pkg ? curationLm : undefined;
92
+ const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next, lm ? { lm } : {});
53
93
  if (!r)
54
- continue;
94
+ continue; // no trainable window: the LM was never touched
95
+ curationLm = undefined; // trained in place — spent
55
96
  pkg = r.pkg;
56
97
  lossSum += r.loss;
57
98
  passes++;
58
99
  learned.push(...pass.map((d) => d.id));
59
100
  }
60
101
  if (passes === 0)
61
- return { status: "no_window", pending: docs.length, version };
102
+ return { status: "no_window", pending: docs.length, version, ...(curation ? { curation } : {}) };
62
103
  const loss = lossSum / passes;
63
104
  // Keep the model this pass started from, so one bad adaptation is one rename away
64
105
  // from undone. The new model is written beside the old one and renamed into place,
@@ -70,6 +111,6 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
70
111
  model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
71
112
  model.fs.renameSync(staged, modelFile);
72
113
  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 };
114
+ return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel, ...(curation ? { curation } : {}) };
74
115
  }
75
116
  //# 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.3",
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.3",
60
+ "@seanhogg/builderforce-memory-engine": "^2026.10.3",
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.3",
87
+ "@seanhogg/builderforce-memory-engine": "2026.10.3"
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.3",
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.3",
19
19
  "transport": {
20
20
  "type": "stdio"
21
21
  },
@@ -11,6 +11,7 @@
11
11
 
12
12
  import type {
13
13
  Adaptation,
14
+ CurationRecord,
14
15
  Episode,
15
16
  EpisodeSummary,
16
17
  ExperienceSnapshot,
@@ -129,6 +130,10 @@ export class FileExperienceStore implements ExperienceStore {
129
130
  this.fresh();
130
131
  await this.inner.recordAdaptation(adaptation);
131
132
  }
133
+ async recordCuration(curation: CurationRecord): Promise<void> {
134
+ this.fresh();
135
+ await this.inner.recordCuration(curation);
136
+ }
132
137
 
133
138
  async snapshot(): Promise<ExperienceSnapshot> {
134
139
  this.fresh();
@@ -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,186 @@
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
+ curationRecords,
21
+ experienceDocuments,
22
+ packDocuments,
23
+ CurationResult,
24
+ EvermindTextEmbedder,
25
+ ExperienceDocument,
26
+ ExperienceSnapshot,
27
+ ExperienceStore,
28
+ } from "@seanhogg/builderforce-memory-engine";
29
+ import type { LoadedEvermind } from "../model/evermind-package.js";
30
+
31
+ /** The engine functions training needs, passed in so the peer stays optional. */
32
+ export interface TrainEngine {
33
+ experienceDocuments: typeof experienceDocuments;
34
+ packDocuments: typeof packDocuments;
35
+ adaptPackage: typeof adaptPackage;
36
+ EVERMIND_ADAPT_MAX_CHARS: number;
37
+ /** The opt-in curation step and the CPU embedder it scores with (engine ≥ 2026.10.2). */
38
+ curatePendingExperience?: typeof curatePendingExperience;
39
+ EvermindTextEmbedder?: typeof EvermindTextEmbedder;
40
+ /** The `curated_out` records to persist for a curation (engine ≥ 2026.10.3). */
41
+ curationRecords?: typeof curationRecords;
42
+ }
43
+
44
+ /**
45
+ * What curation left out of a pass, when it ran: `dropped` this call, and
46
+ * `alreadyDropped` — left out by an earlier call, verdict still standing, so skipped
47
+ * without being embedded again.
48
+ */
49
+ export type CurationReport = { dropped: CurationResult["dropped"]; alreadyDropped?: CurationResult["dropped"] };
50
+
51
+ export type TrainOutcome =
52
+ | { status: "nothing_new"; pending: 0; version: string }
53
+ | { status: "no_window"; pending: number; version: string; curation?: CurationReport }
54
+ | { status: "curated_out"; pending: number; version: string; curation: CurationReport }
55
+ | {
56
+ status: "trained";
57
+ learned: number;
58
+ passes: number;
59
+ loss: number;
60
+ version: string;
61
+ previousModel: string;
62
+ curation?: CurationReport;
63
+ };
64
+
65
+ const EXP_SUFFIX = /\+exp(\d+)$/;
66
+
67
+ /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
68
+ export function nextExperienceVersion(version: string): string {
69
+ const m = EXP_SUFFIX.exec(version);
70
+ return m ? version.replace(EXP_SUFFIX, `+exp${Number(m[1]) + 1}`) : `${version}+exp1`;
71
+ }
72
+
73
+ /** Which adaptation produced this model: N for `+expN`, 0 for a base that has none. */
74
+ export function experienceIndex(version: string): number {
75
+ const m = EXP_SUFFIX.exec(version);
76
+ return m ? Number(m[1]) : 0;
77
+ }
78
+
79
+ /**
80
+ * Split the procedures by what the model at `modelVersion` has learned: `pending` in
81
+ * corpus order, `known` most recently learned first (what curation de-duplicates
82
+ * against — the engine embeds only the most recent `CURATION_KNOWN_LIMIT` of them).
83
+ */
84
+ function splitDocuments(snap: ExperienceSnapshot, engine: TrainEngine, modelVersion: string) {
85
+ const current = experienceIndex(modelVersion);
86
+ const learnedAt = (id: string): number | null => {
87
+ const n = snap.learned[id];
88
+ return typeof n === "number" && n >= 1 && n <= current ? n : null;
89
+ };
90
+ const pending: ExperienceDocument[] = [];
91
+ const known: { doc: ExperienceDocument; at: number }[] = [];
92
+ for (const doc of engine.experienceDocuments(snap.episodes, snap.skills)) {
93
+ const at = learnedAt(doc.id);
94
+ if (at == null) pending.push(doc);
95
+ else known.push({ doc, at });
96
+ }
97
+ known.sort((a, b) => b.at - a.at);
98
+ return { pending, known: known.map((k) => k.doc) };
99
+ }
100
+
101
+ /** Procedures the model has not learned yet. */
102
+ export async function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string) {
103
+ return splitDocuments(await store.snapshot(), engine, modelVersion).pending;
104
+ }
105
+
106
+ export interface TrainExperienceOptions {
107
+ /**
108
+ * Opt-in curation between "what is new" and the adaptation passes: the engine's
109
+ * `curatePendingExperience` (the `experience.quality` filter, trained on this
110
+ * store's run outcomes, + near-duplicate removal against the batch AND the
111
+ * recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
112
+ * model's own CPU embedder. Default false ⇒ every pending procedure is learned,
113
+ * exactly as before. A procedure curation drops is NOT recorded as learned; it is
114
+ * recorded as `curated_out` (with the id it duplicates, or its quality score), and
115
+ * later curations skip it while that verdict stands — a duplicate until what it
116
+ * repeats is no longer learned, a low-quality one until it has new runs.
117
+ */
118
+ curate?: boolean;
119
+ }
120
+
121
+ /** The message when curation is asked of an engine that predates it. */
122
+ export const CURATION_UNSUPPORTED = "Curation needs @seanhogg/builderforce-memory-engine 2026.10.2 or newer.";
123
+
124
+ export async function trainExperience(
125
+ store: ExperienceStore,
126
+ engine: TrainEngine,
127
+ model: LoadedEvermind,
128
+ modelFile: string,
129
+ opts: TrainExperienceOptions = {},
130
+ ): Promise<TrainOutcome> {
131
+ const version = model.pkg.manifest.version ?? "0";
132
+ const snap = await store.snapshot();
133
+ const { pending, known } = splitDocuments(snap, engine, version);
134
+ if (pending.length === 0) return { status: "nothing_new", pending: 0, version };
135
+
136
+ let docs = pending;
137
+ let curation: CurationReport | undefined;
138
+ /** The LM curation embedded with — untrained, loaded from `model.pkg` — reused by the first pass. */
139
+ let curationLm: ConstructorParameters<typeof EvermindTextEmbedder>[0] | undefined;
140
+ if (opts.curate) {
141
+ if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder) throw new Error(CURATION_UNSUPPORTED);
142
+ // The model being trained embeds for curation: its own notion of "the same procedure".
143
+ // Embedding never changes its weights, so the same LM is the first pass's copy.
144
+ curationLm = model.pkg.loadLM() as ConstructorParameters<typeof EvermindTextEmbedder>[0];
145
+ const codec = model.codec as ConstructorParameters<typeof EvermindTextEmbedder>[1];
146
+ const embedder = new engine.EvermindTextEmbedder(curationLm, codec);
147
+ const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
148
+ docs = r.kept;
149
+ curation = { dropped: r.dropped, ...(r.alreadyDropped?.length ? { alreadyDropped: r.alreadyDropped } : {}) };
150
+ // Persist the verdicts, so the next call skips these instead of re-embedding them.
151
+ if (engine.curationRecords) await store.recordCuration(engine.curationRecords(r, snap, Date.now()));
152
+ }
153
+ if (docs.length === 0) return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
154
+
155
+ const next = nextExperienceVersion(version);
156
+ // The engine's package type; the structural view is what was loaded from disk.
157
+ let pkg = model.pkg as unknown as Parameters<typeof adaptPackage>[0];
158
+ const learned: string[] = [];
159
+ let lossSum = 0;
160
+ let passes = 0;
161
+ for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
162
+ // Until a pass succeeds `pkg` is still `model.pkg`, so curation's untrained LM is its copy.
163
+ const lm = pkg === (model.pkg as unknown) ? curationLm : undefined;
164
+ const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next, lm ? { lm } : {});
165
+ if (!r) continue; // no trainable window: the LM was never touched
166
+ curationLm = undefined; // trained in place — spent
167
+ pkg = r.pkg;
168
+ lossSum += r.loss;
169
+ passes++;
170
+ learned.push(...pass.map((d) => d.id));
171
+ }
172
+ if (passes === 0) return { status: "no_window", pending: docs.length, version, ...(curation ? { curation } : {}) };
173
+
174
+ const loss = lossSum / passes;
175
+ // Keep the model this pass started from, so one bad adaptation is one rename away
176
+ // from undone. The new model is written beside the old one and renamed into place,
177
+ // so a crash mid-write never leaves a truncated model. The ledger is written only
178
+ // after the new model is on disk.
179
+ const previousModel = `${modelFile}.prev`;
180
+ model.fs.copyFileSync(modelFile, previousModel);
181
+ const staged = `${modelFile}.next`;
182
+ model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
183
+ model.fs.renameSync(staged, modelFile);
184
+ await store.recordAdaptation({ index: experienceIndex(next), version: next, learned, passes, loss, at: Date.now() });
185
+ return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel, ...(curation ? { curation } : {}) };
186
+ }