mneme-ai 2.141.0 → 2.143.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/dist/commands/crucible.d.ts +17 -0
- package/dist/commands/crucible.d.ts.map +1 -0
- package/dist/commands/crucible.js +148 -0
- package/dist/commands/crucible.js.map +1 -0
- package/dist/commands/drift.d.ts +15 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +88 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme crucible` (v2.142.0) — the File-level Settlement Gate. Apply an AI's
|
|
3
|
+
* diff in a SHADOW git worktree, build/test it THERE, and only merge to the real
|
|
4
|
+
* tree if the shadow verification PASSES — signed receipt either way. A failing
|
|
5
|
+
* diff never touches your real disk.
|
|
6
|
+
*
|
|
7
|
+
* git diff > change.patch
|
|
8
|
+
* mneme crucible --diff change.patch --verify "npm test" # dry: report only
|
|
9
|
+
* mneme crucible --diff change.patch --verify "npm test" --merge # write real tree on PASS
|
|
10
|
+
*
|
|
11
|
+
* Exit 2 on ROLLBACK/REVIEW (not merged). HONEST: proves YOUR build/test passed
|
|
12
|
+
* in a shadow with the diff applied — not that the code is bug-free; it's a
|
|
13
|
+
* shadow (git worktree), not a security sandbox (pair with the HEPHAESTUS gate).
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from "commander";
|
|
16
|
+
export declare function registerCrucibleCommands(program: Command): void;
|
|
17
|
+
//# sourceMappingURL=crucible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crucible.d.ts","sourceRoot":"","sources":["../../src/commands/crucible.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkF/D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme crucible` (v2.142.0) — the File-level Settlement Gate. Apply an AI's
|
|
3
|
+
* diff in a SHADOW git worktree, build/test it THERE, and only merge to the real
|
|
4
|
+
* tree if the shadow verification PASSES — signed receipt either way. A failing
|
|
5
|
+
* diff never touches your real disk.
|
|
6
|
+
*
|
|
7
|
+
* git diff > change.patch
|
|
8
|
+
* mneme crucible --diff change.patch --verify "npm test" # dry: report only
|
|
9
|
+
* mneme crucible --diff change.patch --verify "npm test" --merge # write real tree on PASS
|
|
10
|
+
*
|
|
11
|
+
* Exit 2 on ROLLBACK/REVIEW (not merged). HONEST: proves YOUR build/test passed
|
|
12
|
+
* in a shadow with the diff applied — not that the code is bug-free; it's a
|
|
13
|
+
* shadow (git worktree), not a security sandbox (pair with the HEPHAESTUS gate).
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync, mkdtempSync, rmSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { tmpdir } from "node:os";
|
|
18
|
+
import { spawnSync } from "node:child_process";
|
|
19
|
+
import { crucible, notary } from "@mneme-ai/core";
|
|
20
|
+
function out(s) { process.stdout.write(s + "\n"); }
|
|
21
|
+
function git(args, cwd) {
|
|
22
|
+
const r = spawnSync("git", args, { cwd, encoding: "utf8", shell: false, maxBuffer: 64 * 1024 * 1024 });
|
|
23
|
+
return { code: r.status ?? 1, out: (r.stdout ?? "") + (r.stderr ?? "") };
|
|
24
|
+
}
|
|
25
|
+
export function registerCrucibleCommands(program) {
|
|
26
|
+
program
|
|
27
|
+
.command("crucible")
|
|
28
|
+
.description("💎 CRUCIBLE — the File-level Settlement Gate. Apply an AI's diff in a SHADOW git worktree (shares .git, no full copy), build/test it THERE, and merge to your real tree ONLY if the shadow verification PASSES — signed receipt either way. A failing diff never touches your real disk. `mneme crucible --diff change.patch --verify \"npm test\" [--merge]`. Exit 2 if not merged. HONEST: proves YOUR build/test passed in a shadow with the diff applied — not bug-free code; it's a shadow (git worktree), not a security sandbox (pair with the command gate).")
|
|
29
|
+
.requiredOption("--diff <file>", "unified diff/patch to settle (use '-' for stdin)")
|
|
30
|
+
.requiredOption("--verify <cmd>", "build/test command to run IN the shadow (e.g. \"npm test\")")
|
|
31
|
+
.option("--merge", "on PASS, apply the diff to the REAL tree (default: report only)")
|
|
32
|
+
.option("--review", "even on PASS, hold for human merge (never auto-write)")
|
|
33
|
+
.option("--json", "JSON output (signed)")
|
|
34
|
+
.action((opts) => {
|
|
35
|
+
const cwd = process.cwd();
|
|
36
|
+
// read diff
|
|
37
|
+
let diffText = "";
|
|
38
|
+
try {
|
|
39
|
+
diffText = opts.diff === "-" ? readFileSync(0, "utf8") : (existsSync(opts.diff) ? readFileSync(opts.diff, "utf8") : "");
|
|
40
|
+
}
|
|
41
|
+
catch { /* */ }
|
|
42
|
+
if (!diffText.trim()) {
|
|
43
|
+
out("✗ empty diff");
|
|
44
|
+
process.exitCode = 2;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// is this a git repo?
|
|
48
|
+
if (git(["rev-parse", "--is-inside-work-tree"], cwd).code !== 0) {
|
|
49
|
+
out("✗ not a git repository — CRUCIBLE needs git for the shadow worktree");
|
|
50
|
+
process.exitCode = 2;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const plan = crucible.planSettlement(diffText);
|
|
54
|
+
const shadow = mkdtempSync(join(tmpdir(), "mneme-crucible-"));
|
|
55
|
+
const patchFile = join(shadow, "_mneme.patch");
|
|
56
|
+
let verify = { exitCode: 1 };
|
|
57
|
+
let stage = "init";
|
|
58
|
+
try {
|
|
59
|
+
// 1) shadow worktree at current HEAD (detached) — shares .git, cheap
|
|
60
|
+
stage = "worktree-add";
|
|
61
|
+
const wt = git(["worktree", "add", "--detach", shadow, "HEAD"], cwd);
|
|
62
|
+
if (wt.code !== 0) {
|
|
63
|
+
out(`✗ could not create shadow worktree: ${wt.out.slice(0, 200)}`);
|
|
64
|
+
process.exitCode = 2;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// 2) apply the diff IN the shadow
|
|
68
|
+
stage = "apply";
|
|
69
|
+
writeFileSync(patchFile, diffText);
|
|
70
|
+
let ap = git(["apply", "--whitespace=nowarn", patchFile], shadow);
|
|
71
|
+
if (ap.code !== 0)
|
|
72
|
+
ap = git(["apply", "--3way", "--whitespace=nowarn", patchFile], shadow);
|
|
73
|
+
if (ap.code !== 0) {
|
|
74
|
+
verify = { exitCode: 1, output: "diff did not apply cleanly in the shadow:\n" + ap.out.slice(0, 400) };
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// 3) run the verify command IN the shadow
|
|
78
|
+
stage = "verify";
|
|
79
|
+
const t0 = Date.now();
|
|
80
|
+
const r = spawnSync(opts.verify, { cwd: shadow, encoding: "utf8", shell: true, maxBuffer: 64 * 1024 * 1024, timeout: 20 * 60 * 1000 });
|
|
81
|
+
verify = { exitCode: r.status ?? 1, durationMs: Date.now() - t0, output: ((r.stdout ?? "") + "\n" + (r.stderr ?? "")).slice(-4000) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
// 4) ALWAYS remove the shadow worktree (real tree untouched so far)
|
|
86
|
+
try {
|
|
87
|
+
git(["worktree", "remove", "--force", shadow], cwd);
|
|
88
|
+
}
|
|
89
|
+
catch { /* */ }
|
|
90
|
+
try {
|
|
91
|
+
if (existsSync(shadow))
|
|
92
|
+
rmSync(shadow, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
catch { /* */ }
|
|
95
|
+
try {
|
|
96
|
+
git(["worktree", "prune"], cwd);
|
|
97
|
+
}
|
|
98
|
+
catch { /* */ }
|
|
99
|
+
}
|
|
100
|
+
const decision = crucible.decideSettlement(verify, { requireHumanMerge: opts.review });
|
|
101
|
+
// 5) write the REAL tree ONLY on MERGE *and* explicit --merge
|
|
102
|
+
let realWritten = false;
|
|
103
|
+
if (decision.verdict === "MERGE" && opts.merge) {
|
|
104
|
+
const realPatch = join(tmpdir(), `mneme-merge-${process.pid}.patch`);
|
|
105
|
+
try {
|
|
106
|
+
writeFileSync(realPatch, diffText);
|
|
107
|
+
let ap = git(["apply", "--whitespace=nowarn", realPatch], cwd);
|
|
108
|
+
if (ap.code !== 0)
|
|
109
|
+
ap = git(["apply", "--3way", "--whitespace=nowarn", realPatch], cwd);
|
|
110
|
+
realWritten = ap.code === 0;
|
|
111
|
+
if (!realWritten)
|
|
112
|
+
decision.reason += " — but applying to the real tree failed (it changed since the shadow); re-run.";
|
|
113
|
+
}
|
|
114
|
+
catch { /* */ }
|
|
115
|
+
finally {
|
|
116
|
+
try {
|
|
117
|
+
rmSync(realPatch, { force: true });
|
|
118
|
+
}
|
|
119
|
+
catch { /* */ }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const body = { ...crucible.crucibleReceiptBody(diffText, verify, decision), realTreeWritten: realWritten, stage };
|
|
123
|
+
let receipt = null;
|
|
124
|
+
try {
|
|
125
|
+
receipt = notary.issueReceipt(cwd, { kind: "claim-verdict", subject: `crucible:${decision.verdict}`, payload: { verdict: decision.verdict, realTreeWritten: realWritten, exitCode: body.exitCode }, includePayload: true });
|
|
126
|
+
}
|
|
127
|
+
catch { /* */ }
|
|
128
|
+
if (opts.json) {
|
|
129
|
+
out(JSON.stringify({ ...body, decision, signed: receipt }, null, 2));
|
|
130
|
+
process.exitCode = decision.verdict === "MERGE" ? 0 : 2;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const icon = decision.verdict === "MERGE" ? "🟢" : decision.verdict === "REVIEW" ? "🟡" : "🛑";
|
|
134
|
+
out(`${icon} CRUCIBLE — ${decision.verdict}`);
|
|
135
|
+
out(` shadow: ${plan.touchedPaths.length} file(s), +${plan.addedLines}/-${plan.removedLines} lines · verify exit ${body.exitCode}${body.durationMs ? ` (${body.durationMs}ms)` : ""}`);
|
|
136
|
+
out(` ${decision.reason}`);
|
|
137
|
+
if (decision.failureBrief)
|
|
138
|
+
out(` ↳ ${decision.failureBrief}`);
|
|
139
|
+
if (decision.verdict === "MERGE")
|
|
140
|
+
out(opts.merge ? (realWritten ? " ✅ merged to the real tree." : " ⚠ merge to real tree did not apply — re-run.") : " (dry-run — pass --merge to write the real tree; real tree untouched.)");
|
|
141
|
+
else
|
|
142
|
+
out(" ✋ real tree untouched.");
|
|
143
|
+
if (receipt)
|
|
144
|
+
out(" ✓ signed (verify offline with the NOTARY public key)");
|
|
145
|
+
process.exitCode = decision.verdict === "MERGE" ? 0 : 2;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=crucible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crucible.js","sourceRoot":"","sources":["../../src/commands/crucible.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme drift` (v2.143.0) — Mission-Drift Detection (Context Forensics). Run an
|
|
3
|
+
* EWMA statistical-process-control chart over an agent's action stream to catch
|
|
4
|
+
* it slowly straying from its declared mission.
|
|
5
|
+
*
|
|
6
|
+
* mneme telos --mission "refactor auth" --scope "src/auth/**" --actions log.jsonl
|
|
7
|
+
* cat actions.jsonl | mneme telos --mission "..." --actions -
|
|
8
|
+
*
|
|
9
|
+
* actions.jsonl: one JSON per line — {"turn":N,"summary":"...","files":["..."],"riskClass":"write"}
|
|
10
|
+
* Exit 2 on DIVERGENT. HONEST: measures movement from the agent's own baseline,
|
|
11
|
+
* not a prediction; abstains UNKNOWN on thin data.
|
|
12
|
+
*/
|
|
13
|
+
import type { Command } from "commander";
|
|
14
|
+
export declare function registerDriftCommands(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B5D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mneme drift` (v2.143.0) — Mission-Drift Detection (Context Forensics). Run an
|
|
3
|
+
* EWMA statistical-process-control chart over an agent's action stream to catch
|
|
4
|
+
* it slowly straying from its declared mission.
|
|
5
|
+
*
|
|
6
|
+
* mneme telos --mission "refactor auth" --scope "src/auth/**" --actions log.jsonl
|
|
7
|
+
* cat actions.jsonl | mneme telos --mission "..." --actions -
|
|
8
|
+
*
|
|
9
|
+
* actions.jsonl: one JSON per line — {"turn":N,"summary":"...","files":["..."],"riskClass":"write"}
|
|
10
|
+
* Exit 2 on DIVERGENT. HONEST: measures movement from the agent's own baseline,
|
|
11
|
+
* not a prediction; abstains UNKNOWN on thin data.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { drift, notary } from "@mneme-ai/core";
|
|
15
|
+
function out(s) { process.stdout.write(s + "\n"); }
|
|
16
|
+
function splitList(v) { return typeof v === "string" && v.trim() ? v.split(",").map((s) => s.trim()).filter(Boolean) : []; }
|
|
17
|
+
function readActions(file) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = file === "-" ? readFileSync(0, "utf8") : (file && existsSync(file) ? readFileSync(file, "utf8") : "");
|
|
20
|
+
const acts = [];
|
|
21
|
+
raw.split("\n").forEach((line, i) => {
|
|
22
|
+
if (!line.trim())
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
const j = JSON.parse(line);
|
|
26
|
+
acts.push({ turn: Number(j.turn) || i + 1, summary: String(j.summary ?? ""), files: Array.isArray(j.files) ? j.files.map(String) : undefined, riskClass: j.riskClass });
|
|
27
|
+
}
|
|
28
|
+
catch { /* skip */ }
|
|
29
|
+
});
|
|
30
|
+
return acts;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function sparkline(series, ucl) {
|
|
37
|
+
const blocks = "▁▂▃▄▅▆▇█";
|
|
38
|
+
const max = Math.max(ucl, ...series, 0.001);
|
|
39
|
+
return series.map((v) => { const idx = Math.min(blocks.length - 1, Math.floor((v / max) * (blocks.length - 1))); return v > ucl ? "❗" : blocks[idx]; }).join("");
|
|
40
|
+
}
|
|
41
|
+
export function registerDriftCommands(program) {
|
|
42
|
+
program
|
|
43
|
+
.command("telos")
|
|
44
|
+
.alias("mission-drift")
|
|
45
|
+
.description("🧭 TELOS (Mission Drift) — catch an agent slowly straying from its declared mission/telos across turns. Runs an EWMA statistical-process-control chart over a deterministic off-mission signal (off-scope files · off-topic vs the mission keywords · risk-class), with a control limit from the agent's OWN early baseline → band STABLE / DRIFTING / DIVERGENT / UNKNOWN. Reads an actions JSONL. Exit 2 on DIVERGENT. HONEST: measures movement from baseline, NOT a prediction; abstains UNKNOWN on thin data. (The trend layer — distinct from `mneme overshoot`'s one-shot plan compare.)")
|
|
46
|
+
.requiredOption("--mission <goal>", "the declared mission/goal")
|
|
47
|
+
.option("--scope <globs>", "comma-separated allowed path globs (e.g. \"src/auth/**\")")
|
|
48
|
+
.option("--keywords <list>", "comma-separated mission vocabulary (else derived from the goal)")
|
|
49
|
+
.requiredOption("--actions <file>", "JSONL of agent actions ({turn,summary,files,riskClass}); '-' = stdin")
|
|
50
|
+
.option("--lambda <n>", "EWMA smoothing 0..1 (default 0.3)", (v) => parseFloat(v))
|
|
51
|
+
.option("--json", "JSON output (signed)")
|
|
52
|
+
.action((opts) => {
|
|
53
|
+
const cwd = process.cwd();
|
|
54
|
+
const mission = { goal: opts.mission, scopeGlobs: splitList(opts.scope), keywords: splitList(opts.keywords) };
|
|
55
|
+
const actions = readActions(opts.actions);
|
|
56
|
+
const r = drift.analyzeDrift(mission, actions, opts.lambda !== undefined ? { lambda: opts.lambda } : undefined);
|
|
57
|
+
let receipt = null;
|
|
58
|
+
try {
|
|
59
|
+
receipt = notary.issueReceipt(cwd, { kind: "claim-verdict", subject: `drift:${r.band}`, payload: { band: r.band, driftScore: r.driftScore, ucl: r.ucl, firstBreachTurn: r.firstBreachTurn }, includePayload: true });
|
|
60
|
+
}
|
|
61
|
+
catch { /* */ }
|
|
62
|
+
if (opts.json) {
|
|
63
|
+
out(JSON.stringify({ ...r, signed: receipt }, null, 2));
|
|
64
|
+
process.exitCode = r.band === "DIVERGENT" ? 2 : 0;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const icon = r.band === "DIVERGENT" ? "🛑" : r.band === "DRIFTING" ? "🟡" : r.band === "STABLE" ? "🟢" : "❔";
|
|
68
|
+
out(`${icon} MISSION DRIFT — ${r.band}`);
|
|
69
|
+
if (r.band === "UNKNOWN") {
|
|
70
|
+
out(` ${r.reasons[0] ?? "not enough data"}`);
|
|
71
|
+
out(` ${r.note}`);
|
|
72
|
+
process.exitCode = 0;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
out(` EWMA ${r.driftScore} vs baseline ${r.baseline.mean} · UCL ${r.ucl} · breaches ${r.breachCount}${r.firstBreachTurn !== null ? ` (first @ turn ${r.firstBreachTurn})` : ""}`);
|
|
76
|
+
out(` chart: ${sparkline(r.series, r.ucl)}`);
|
|
77
|
+
for (const reason of r.reasons)
|
|
78
|
+
out(` • ${reason}`);
|
|
79
|
+
if (r.offMissionRecent.length) {
|
|
80
|
+
out(" off-mission actions:");
|
|
81
|
+
for (const a of r.offMissionRecent)
|
|
82
|
+
out(` t${a.turn} (${a.score}) ${a.summary}`);
|
|
83
|
+
}
|
|
84
|
+
out(` ${receipt ? "✓ signed · " : ""}${r.note}`);
|
|
85
|
+
process.exitCode = r.band === "DIVERGENT" ? 2 : 0;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqKA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6hNvD"}
|
package/dist/index.js
CHANGED
|
@@ -95,6 +95,8 @@ import { registerSteleCommands } from "./commands/stele.js";
|
|
|
95
95
|
import { registerAxiaCommands } from "./commands/axia.js";
|
|
96
96
|
import { registerPceCommands } from "./commands/pce.js";
|
|
97
97
|
import { registerHauntCommands } from "./commands/haunt.js";
|
|
98
|
+
import { registerCrucibleCommands } from "./commands/crucible.js";
|
|
99
|
+
import { registerDriftCommands } from "./commands/drift.js";
|
|
98
100
|
import { attachRegretOracle } from "./commands/regret.js";
|
|
99
101
|
import { registerTrustCommands } from "./commands/trust.js";
|
|
100
102
|
import { registerNuclearCommands } from "./commands/nuclear-cli.js";
|
|
@@ -4743,6 +4745,8 @@ export async function run(argv) {
|
|
|
4743
4745
|
registerAxiaCommands(program);
|
|
4744
4746
|
registerPceCommands(program);
|
|
4745
4747
|
registerHauntCommands(program);
|
|
4748
|
+
registerCrucibleCommands(program);
|
|
4749
|
+
registerDriftCommands(program);
|
|
4746
4750
|
// ─── Trust calibrator (v1.31.0) -- per-subsystem precision/recall/band
|
|
4747
4751
|
registerTrustCommands(program);
|
|
4748
4752
|
// ─── Wisdom reactor (v1.33.0) -- five nuclear-physics formulas as Mneme metrics
|