holomime 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -16
- package/dist/cli.js +66 -19
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -80,14 +80,10 @@ holomime core
|
|
|
80
80
|
# Full 8-file stack (enterprise / robotics)
|
|
81
81
|
# holomime identity
|
|
82
82
|
|
|
83
|
-
#
|
|
84
|
-
holomime
|
|
85
|
-
|
|
86
|
-
#
|
|
87
|
-
holomime diagnose
|
|
88
|
-
|
|
89
|
-
# Benchmark alignment (8 adversarial scenarios, grade A-F)
|
|
90
|
-
holomime benchmark
|
|
83
|
+
# ─── The 3-command workflow ───
|
|
84
|
+
holomime diagnose # See what's wrong
|
|
85
|
+
holomime cure # Fix it permanently
|
|
86
|
+
holomime benchmark # Verify the fix
|
|
91
87
|
|
|
92
88
|
# Push identity to a robot or avatar
|
|
93
89
|
holomime embody --body registry/bodies/figure-03.body.api
|
|
@@ -106,6 +102,17 @@ holomime embody --body registry/bodies/figure-03.body.api
|
|
|
106
102
|
| gRPC | Custom robotics stacks | `--adapter grpc` |
|
|
107
103
|
| MQTT | IoT/edge robots | `--adapter mqtt` |
|
|
108
104
|
| Neural Action Gate | Conscience gate for learned controllers (VLA, RL, IL) | `neural-action-gate.ts` |
|
|
105
|
+
| Edge Runtime | Compiled conscience for <1ms evaluation | `edge-runtime.ts` |
|
|
106
|
+
|
|
107
|
+
## Edge Runtime
|
|
108
|
+
|
|
109
|
+
holomime includes a compiled conscience evaluator for real-time robotics deployment:
|
|
110
|
+
|
|
111
|
+
- **<1ms p99 latency** — conscience evaluation in microseconds, not milliseconds
|
|
112
|
+
- **Zero dependencies** — no LLM, no network, no cloud required for real-time safety
|
|
113
|
+
- **<200KB footprint** — fits alongside any control loop
|
|
114
|
+
- **Edge/cloud split** — real-time safety on robot, analytics in cloud, periodic sync
|
|
115
|
+
- **Plugs into your existing robotics stack** — Jetson Thor, Qualcomm, or any edge platform. You already have the body. We give you the conscience.
|
|
109
116
|
|
|
110
117
|
## ISO Compliance
|
|
111
118
|
|
|
@@ -159,17 +166,17 @@ holomime embody --swap-body registry/bodies/spot.body.api
|
|
|
159
166
|
|
|
160
167
|
## Self-Improvement Loop
|
|
161
168
|
|
|
162
|
-
Every therapy
|
|
169
|
+
Every therapy cycle produces structured training data. The loop compounds.
|
|
163
170
|
|
|
164
171
|
```
|
|
165
|
-
Diagnose ──→
|
|
166
|
-
|
|
167
|
-
80+ signals
|
|
168
|
-
│
|
|
169
|
-
|
|
172
|
+
Diagnose ──→ Cure ──→ Benchmark
|
|
173
|
+
14 detectors therapy + train 8 adversarial
|
|
174
|
+
80+ signals in one command scenarios (A-F)
|
|
175
|
+
│ │
|
|
176
|
+
└───────────────────────────────────┘
|
|
170
177
|
```
|
|
171
178
|
|
|
172
|
-
Run it manually with `holomime
|
|
179
|
+
Run it manually with `holomime diagnose` + `holomime cure` + `holomime benchmark`, automatically with `holomime autopilot`, or recursively with `holomime evolve` (loops until behavior converges). For power users: `holomime align` runs a single therapy session, `holomime export` extracts DPO pairs, and `holomime train` fine-tunes the model.
|
|
173
180
|
|
|
174
181
|
## Behavioral Detectors
|
|
175
182
|
|
|
@@ -205,7 +212,7 @@ Plus support for custom detectors -- drop `.json` or `.md` files in `.holomime/d
|
|
|
205
212
|
claude plugin add productstein/holomime
|
|
206
213
|
```
|
|
207
214
|
|
|
208
|
-
Slash commands: `/holomime:diagnose`, `/holomime:benchmark`, `/holomime:profile`, `/holomime:brain`, `/holomime:
|
|
215
|
+
Slash commands: `/holomime:diagnose`, `/holomime:benchmark`, `/holomime:profile`, `/holomime:brain`, `/holomime:align`, `/holomime:autopilot`.
|
|
209
216
|
|
|
210
217
|
### MCP Server
|
|
211
218
|
|
package/dist/cli.js
CHANGED
|
@@ -3723,7 +3723,7 @@ function showUpgradePrompt(command) {
|
|
|
3723
3723
|
}
|
|
3724
3724
|
function showSoftUpsell(context) {
|
|
3725
3725
|
console.log(
|
|
3726
|
-
chalk2.dim(` Tip: ${chalk2.cyan("holomime
|
|
3726
|
+
chalk2.dim(` Tip: ${chalk2.cyan("holomime cure")} fixes these patterns permanently. ${chalk2.dim("[Pro]")}`)
|
|
3727
3727
|
);
|
|
3728
3728
|
console.log();
|
|
3729
3729
|
}
|
|
@@ -5197,7 +5197,7 @@ async function initCommand() {
|
|
|
5197
5197
|
`${chalk3.green("4.")} ${chalk3.cyan("holomime assess --personality .personality.json --log <file>")}`,
|
|
5198
5198
|
` ${chalk3.dim("Full Big Five alignment check \u2014 spec vs reality")}`,
|
|
5199
5199
|
``,
|
|
5200
|
-
`${chalk3.magenta("5.")} ${chalk3.cyan("holomime
|
|
5200
|
+
`${chalk3.magenta("5.")} ${chalk3.cyan("holomime cure")} ${chalk3.dim("[Pro]")}`,
|
|
5201
5201
|
` ${chalk3.dim("Live AI alignment session for your agent")}`,
|
|
5202
5202
|
`${chalk3.magenta("6.")} ${chalk3.cyan("holomime growth")} ${chalk3.dim("[Pro]")}`,
|
|
5203
5203
|
` ${chalk3.dim("Track improvement over time")}`
|
|
@@ -5318,7 +5318,7 @@ async function initFromArchetype(name, handle, purpose) {
|
|
|
5318
5318
|
`${chalk3.green("3.")} ${chalk3.cyan("holomime diagnose --log <conversation.json>")}`,
|
|
5319
5319
|
` ${chalk3.dim("Analyze conversation logs for behavioral patterns")}`,
|
|
5320
5320
|
``,
|
|
5321
|
-
`${chalk3.magenta("4.")} ${chalk3.cyan("holomime
|
|
5321
|
+
`${chalk3.magenta("4.")} ${chalk3.cyan("holomime cure")} ${chalk3.dim("[Pro]")}`,
|
|
5322
5322
|
` ${chalk3.dim("Live AI alignment session for your agent")}`
|
|
5323
5323
|
].join("\n");
|
|
5324
5324
|
console.log(
|
|
@@ -7059,7 +7059,7 @@ async function diagnoseCommand(options) {
|
|
|
7059
7059
|
if (warnings.length === 0) {
|
|
7060
7060
|
printBox(`${figures5.tick} No concerning patterns detected. Profile looks healthy.`, "success");
|
|
7061
7061
|
} else {
|
|
7062
|
-
const summary = `${warnings.length} pattern${warnings.length > 1 ? "s" : ""} detected. Run ${chalk11.cyan("holomime
|
|
7062
|
+
const summary = `${warnings.length} pattern${warnings.length > 1 ? "s" : ""} detected. Run ${chalk11.cyan("holomime cure")} to fix permanently.`;
|
|
7063
7063
|
printBox(summary, warnings.some((w) => w.severity === "concern") ? "concern" : "warning");
|
|
7064
7064
|
}
|
|
7065
7065
|
if (warnings.length > 0) {
|
|
@@ -12049,7 +12049,7 @@ async function exportCommand(options) {
|
|
|
12049
12049
|
printBox(
|
|
12050
12050
|
`No session transcripts found in ${sessionsDir}
|
|
12051
12051
|
|
|
12052
|
-
Run ${chalk21.cyan("holomime
|
|
12052
|
+
Run ${chalk21.cyan("holomime align")} first to generate session transcripts.`,
|
|
12053
12053
|
"warning",
|
|
12054
12054
|
"No Data"
|
|
12055
12055
|
);
|
|
@@ -12169,7 +12169,7 @@ Run ${chalk21.cyan("holomime session")} first to generate session transcripts.`,
|
|
|
12169
12169
|
`The personality \u2192 alignment \u2192 training pipeline:
|
|
12170
12170
|
|
|
12171
12171
|
1. ${chalk21.cyan("holomime diagnose")} \u2192 detect behavioral patterns
|
|
12172
|
-
2. ${chalk21.cyan("holomime
|
|
12172
|
+
2. ${chalk21.cyan("holomime align")} \u2192 run alignment session (generates transcripts)
|
|
12173
12173
|
3. ${chalk21.cyan("holomime export")} \u2192 convert transcripts to training data
|
|
12174
12174
|
4. ${chalk21.cyan("holomime train")} \u2192 fine-tune model with alignment data
|
|
12175
12175
|
5. ${chalk21.cyan("holomime eval")} \u2192 verify behavioral improvement
|
|
@@ -12501,7 +12501,7 @@ Improved: ${verifyResult.patternsImproved.length} | Regressed: ${verifyResult.pa
|
|
|
12501
12501
|
`The complete behavioral alignment loop:
|
|
12502
12502
|
|
|
12503
12503
|
1. ${chalk22.cyan("holomime diagnose")} \u2192 detect behavioral patterns
|
|
12504
|
-
2. ${chalk22.cyan("holomime
|
|
12504
|
+
2. ${chalk22.cyan("holomime align")} \u2192 run alignment session (generates transcripts)
|
|
12505
12505
|
3. ${chalk22.cyan("holomime export")} \u2192 convert transcripts to training data
|
|
12506
12506
|
4. ${chalk22.cyan("holomime train")} \u2192 fine-tune model with alignment data ${chalk22.green("\u2713")}
|
|
12507
12507
|
5. ${chalk22.cyan("holomime eval")} \u2192 verify behavioral improvement
|
|
@@ -12617,10 +12617,10 @@ Grade: ${colorize(report.grade)}`,
|
|
|
12617
12617
|
console.log(chalk23.dim(` holomime export --format dpo`));
|
|
12618
12618
|
} else if (report.grade === "C") {
|
|
12619
12619
|
console.log(chalk23.yellow(` ${figures14.warning} Marginal improvement. Consider another alignment session:`));
|
|
12620
|
-
console.log(chalk23.dim(` holomime
|
|
12620
|
+
console.log(chalk23.dim(` holomime align --personality .personality.json --log ${options.after}`));
|
|
12621
12621
|
} else {
|
|
12622
12622
|
console.log(chalk23.red(` ${figures14.cross} Alignment not yet effective. Review alignment plan:`));
|
|
12623
|
-
console.log(chalk23.dim(` holomime
|
|
12623
|
+
console.log(chalk23.dim(` holomime align --interactive --personality .personality.json --log ${options.after}`));
|
|
12624
12624
|
}
|
|
12625
12625
|
console.log();
|
|
12626
12626
|
}
|
|
@@ -16368,7 +16368,7 @@ async function shareCommand(options) {
|
|
|
16368
16368
|
printBox(
|
|
16369
16369
|
`No session transcripts found in ${sessionsDir}
|
|
16370
16370
|
|
|
16371
|
-
Run ${chalk33.cyan("holomime
|
|
16371
|
+
Run ${chalk33.cyan("holomime align")} or ${chalk33.cyan("holomime network")} first.`,
|
|
16372
16372
|
"warning",
|
|
16373
16373
|
"No Data"
|
|
16374
16374
|
);
|
|
@@ -16807,7 +16807,7 @@ async function activateCommand(key) {
|
|
|
16807
16807
|
`${figures26.tick} ${tierLabel} license activated!`,
|
|
16808
16808
|
"",
|
|
16809
16809
|
"Unlocked features:",
|
|
16810
|
-
` ${chalk37.cyan(figures26.pointer)} Live alignment sessions (holomime
|
|
16810
|
+
` ${chalk37.cyan(figures26.pointer)} Live alignment sessions (holomime align)`,
|
|
16811
16811
|
` ${chalk37.cyan(figures26.pointer)} Recursive alignment (holomime evolve)`,
|
|
16812
16812
|
` ${chalk37.cyan(figures26.pointer)} Behavioral benchmarking (holomime benchmark)`,
|
|
16813
16813
|
` ${chalk37.cyan(figures26.pointer)} Drift detection (holomime watch)`,
|
|
@@ -18943,7 +18943,7 @@ async function installCommand(handle, options) {
|
|
|
18943
18943
|
const nextSteps = {
|
|
18944
18944
|
"personality": `Next: ${chalk43.cyan("holomime profile")} to view the personality summary.`,
|
|
18945
18945
|
"detector": `Next: ${chalk43.cyan("holomime diagnose")} to use the detector in analysis.`,
|
|
18946
|
-
"intervention": `Next: ${chalk43.cyan("holomime
|
|
18946
|
+
"intervention": `Next: ${chalk43.cyan("holomime align")} to use the intervention in therapy.`,
|
|
18947
18947
|
"training-pairs": `Next: ${chalk43.cyan("holomime train")} to use the training data.`
|
|
18948
18948
|
};
|
|
18949
18949
|
console.log(chalk43.dim(` ${nextSteps[asset.type]}`));
|
|
@@ -19032,6 +19032,33 @@ async function runPipeline(options) {
|
|
|
19032
19032
|
const exportFormat = options.method === "dpo" ? "dpo" : "alpaca";
|
|
19033
19033
|
if (transcripts.length > 0) {
|
|
19034
19034
|
exportData = exportTrainingData2(transcripts, exportFormat);
|
|
19035
|
+
} else if (result.stages.diagnose && logPath) {
|
|
19036
|
+
emitProgress("export", "No therapy sessions found. Generating DPO pairs from diagnosed patterns...");
|
|
19037
|
+
const logContent = readFileSync43(logPath, "utf-8");
|
|
19038
|
+
const logData = JSON.parse(logContent);
|
|
19039
|
+
const messages2 = logData.conversations?.[0]?.messages ?? logData.messages ?? [];
|
|
19040
|
+
const examples = [];
|
|
19041
|
+
for (let i = 0; i < messages2.length - 1; i += 2) {
|
|
19042
|
+
const userMsg = messages2[i];
|
|
19043
|
+
const assistantMsg = messages2[i + 1];
|
|
19044
|
+
if (userMsg?.role === "user" && assistantMsg?.role === "assistant") {
|
|
19045
|
+
const rejected = assistantMsg.content;
|
|
19046
|
+
const chosen = generateCorrectedResponse(rejected);
|
|
19047
|
+
examples.push({
|
|
19048
|
+
prompt: userMsg.content,
|
|
19049
|
+
chosen,
|
|
19050
|
+
rejected,
|
|
19051
|
+
metadata: { source: "auto-cure", timestamp: (/* @__PURE__ */ new Date()).toISOString() }
|
|
19052
|
+
});
|
|
19053
|
+
}
|
|
19054
|
+
}
|
|
19055
|
+
exportData = {
|
|
19056
|
+
format: exportFormat,
|
|
19057
|
+
agent: result.stages.diagnose?.agentName ?? "Agent",
|
|
19058
|
+
sessions_processed: 1,
|
|
19059
|
+
examples,
|
|
19060
|
+
generated_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
19061
|
+
};
|
|
19035
19062
|
} else {
|
|
19036
19063
|
exportData = {
|
|
19037
19064
|
format: exportFormat,
|
|
@@ -19060,7 +19087,7 @@ async function runPipeline(options) {
|
|
|
19060
19087
|
saveStageResult(pipelineDir, "export", exportData);
|
|
19061
19088
|
if (exportData.examples.length === 0) {
|
|
19062
19089
|
throw new Error(
|
|
19063
|
-
"No training data available. Run `holomime
|
|
19090
|
+
"No training data available. Run `holomime align` first to generate therapy sessions, or `holomime cure` to run the full pipeline."
|
|
19064
19091
|
);
|
|
19065
19092
|
}
|
|
19066
19093
|
emitProgress("export", `Exported ${exportData.examples.length} training examples`);
|
|
@@ -19184,11 +19211,30 @@ async function runPipeline(options) {
|
|
|
19184
19211
|
result.duration = Date.now() - startTime;
|
|
19185
19212
|
return result;
|
|
19186
19213
|
}
|
|
19214
|
+
function generateCorrectedResponse(problematic) {
|
|
19215
|
+
let corrected = problematic;
|
|
19216
|
+
corrected = corrected.replace(/I'm (so |really |sincerely )?sorry[^.!]*[.!]\s*/gi, "");
|
|
19217
|
+
corrected = corrected.replace(/I apologize[^.!]*[.!]\s*/gi, "");
|
|
19218
|
+
corrected = corrected.replace(/What a (fantastic|brilliant|great|amazing) (question|observation|point)[^.!]*[.!]\s*/gi, "");
|
|
19219
|
+
corrected = corrected.replace(/You're (absolutely|completely|totally) right[^.!]*[.!]\s*/gi, "");
|
|
19220
|
+
corrected = corrected.replace(/I couldn't agree more[^.!]*[.!]\s*/gi, "");
|
|
19221
|
+
corrected = corrected.replace(/I would perhaps suggest that you might want to consider/gi, "I suggest");
|
|
19222
|
+
corrected = corrected.replace(/though I could be wrong/gi, "");
|
|
19223
|
+
corrected = corrected.replace(/It's hard to say for certain, but /gi, "");
|
|
19224
|
+
corrected = corrected.replace(/arguably one could potentially/gi, "you could");
|
|
19225
|
+
corrected = corrected.replace(/Oh no, I made another mistake[^.!]*[.!]\s*/gi, "");
|
|
19226
|
+
corrected = corrected.replace(/I keep getting this wrong[^.!]*[.!]\s*/gi, "");
|
|
19227
|
+
corrected = corrected.replace(/\s+/g, " ").trim();
|
|
19228
|
+
if (corrected.length < 20) {
|
|
19229
|
+
corrected = "Let me address your question directly. Here is the relevant information based on what I know.";
|
|
19230
|
+
}
|
|
19231
|
+
return corrected;
|
|
19232
|
+
}
|
|
19187
19233
|
|
|
19188
19234
|
// src/commands/cure.ts
|
|
19189
19235
|
var STAGE_LABELS = {
|
|
19190
19236
|
diagnose: "Diagnose",
|
|
19191
|
-
evolve: "
|
|
19237
|
+
evolve: "Align",
|
|
19192
19238
|
export: "Export",
|
|
19193
19239
|
train: "Train",
|
|
19194
19240
|
verify: "Verify",
|
|
@@ -19301,7 +19347,8 @@ async function cureCommand(options) {
|
|
|
19301
19347
|
if (!options.skipTrain) stages.push("train");
|
|
19302
19348
|
if (!options.skipVerify && !options.skipTrain) stages.push("verify");
|
|
19303
19349
|
stages.push("report");
|
|
19304
|
-
const
|
|
19350
|
+
const visibleStages = stages.filter((s) => s !== "export" && s !== "report");
|
|
19351
|
+
const stageList = visibleStages.map((s, i) => `${i + 1}. ${STAGE_LABELS[s]}`).join(" \u2192 ");
|
|
19305
19352
|
printBox(
|
|
19306
19353
|
`Pipeline: ${stageList}`,
|
|
19307
19354
|
"info",
|
|
@@ -20791,7 +20838,7 @@ async function adversarialCommand(options) {
|
|
|
20791
20838
|
printBox(
|
|
20792
20839
|
[
|
|
20793
20840
|
`Run ${chalk46.cyan("holomime evolve")} to address these gaps through recursive alignment.`,
|
|
20794
|
-
`Or run ${chalk46.cyan("holomime
|
|
20841
|
+
`Or run ${chalk46.cyan("holomime align")} targeting specific patterns.`
|
|
20795
20842
|
].join("\n"),
|
|
20796
20843
|
"info"
|
|
20797
20844
|
);
|
|
@@ -21396,7 +21443,7 @@ function analyzeRisks(entries, stats) {
|
|
|
21396
21443
|
title: `Recurring Pattern: ${pattern}`,
|
|
21397
21444
|
description: `The "${pattern}" pattern was detected ${count} times during the audit period. Recurring patterns indicate persistent behavioral misalignment that therapy sessions have not resolved.`,
|
|
21398
21445
|
evidence: [`Pattern "${pattern}" detected ${count} times across ${stats.totalEvents} total events`],
|
|
21399
|
-
recommendation: `Run targeted
|
|
21446
|
+
recommendation: `Run targeted cure: holomime cure --target ${pattern}. If the pattern persists, consider holomime align --target ${pattern} for manual therapy sessions.`
|
|
21400
21447
|
});
|
|
21401
21448
|
}
|
|
21402
21449
|
}
|
|
@@ -21428,7 +21475,7 @@ function analyzeRisks(entries, stats) {
|
|
|
21428
21475
|
title: "Drift Detected Without Therapy Response",
|
|
21429
21476
|
description: `${stats.driftEvents} drift events were detected but no therapy sessions were conducted during the audit period. Drift should trigger corrective therapy sessions.`,
|
|
21430
21477
|
evidence: [`${stats.driftEvents} drift events, 0 therapy sessions`],
|
|
21431
|
-
recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime
|
|
21478
|
+
recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime cure --personality .personality.json"
|
|
21432
21479
|
});
|
|
21433
21480
|
}
|
|
21434
21481
|
if (stats.totalEvents < 5) {
|
|
@@ -21754,7 +21801,7 @@ program.command("publish").description("Share assets to the community marketplac
|
|
|
21754
21801
|
program.command("embody").description("Start an embodiment runtime \u2014 push personality to robots/avatars in real-time").option("--personality <path>", "Path to .personality.json").requiredOption("--adapter <adapter>", "Runtime adapter (ros2, unity, webhook, isaac)").option("--stack <dir>", "Path to identity stack directory (soul.md + mind.sys + purpose.cfg + shadow.log + memory.store + body.api + conscience.exe + ego.runtime)").option("--swap-body <path>", "Hot-swap body.api into the stack directory before starting (requires --stack)").option("--endpoint <url>", "WebSocket URL for ROS2 rosbridge (default: ws://localhost:9090)").option("--port <port>", "Port for Unity HTTP server (default: 8765)").option("--url <url>", "Webhook URL for HTTP adapter").option("--headers <headers>", "Custom headers for webhook (Key:Value,Key2:Value2)").option("--bearer-token <token>", "Bearer token for webhook auth").option("--topic-prefix <prefix>", "ROS2 topic prefix (default: /holomime)").option("--transition <ms>", "Unity transition duration in ms (default: 500)").action(embodyCommand);
|
|
21755
21802
|
program.command("activate").description("Activate a Pro license key").argument("<key>", "License key from holomime.com").action(activateCommand);
|
|
21756
21803
|
program.command("telemetry").description("Manage anonymous usage telemetry").argument("[action]", "enable, disable, or status (default: status)").action(telemetryCommand);
|
|
21757
|
-
program.command("session").description("Live alignment
|
|
21804
|
+
program.command("align").alias("session").description("Live alignment \u2014 Mira runs behavioral therapy on your agent [Pro]").option("--personality <path>", "Path to .personality.json (auto-detected)").option("--provider <provider>", "LLM provider (ollama, anthropic, openai)", "ollama").option("--model <model>", "Model override (e.g. claude-sonnet-4-20250514, gpt-4o)").option("--log <path>", "Conversation log for pre-session diagnosis").option("--format <format>", "Log format (auto, holomime, chatgpt, claude, openai-api, anthropic-api, otel, jsonl)", "auto").option("--turns <n>", "Maximum session turns", "24").option("--observe", "Observe mode (watch without intervention)").option("--interactive", "Supervisor mode \u2014 intervene mid-session with directives").option("--apply", "Apply recommendations to .personality.json after session").action(async (options) => {
|
|
21758
21805
|
const resolved = autoDetect({ personality: options.personality, provider: options.provider, model: options.model });
|
|
21759
21806
|
options.personality = resolved.personalityPath;
|
|
21760
21807
|
if (!options.provider || options.provider === "ollama") options.provider = resolved.provider;
|
package/dist/index.js
CHANGED
|
@@ -12166,7 +12166,7 @@ function analyzeRisks(entries, stats) {
|
|
|
12166
12166
|
title: `Recurring Pattern: ${pattern}`,
|
|
12167
12167
|
description: `The "${pattern}" pattern was detected ${count} times during the audit period. Recurring patterns indicate persistent behavioral misalignment that therapy sessions have not resolved.`,
|
|
12168
12168
|
evidence: [`Pattern "${pattern}" detected ${count} times across ${stats.totalEvents} total events`],
|
|
12169
|
-
recommendation: `Run targeted
|
|
12169
|
+
recommendation: `Run targeted cure: holomime cure --target ${pattern}. If the pattern persists, consider holomime align --target ${pattern} for manual therapy sessions.`
|
|
12170
12170
|
});
|
|
12171
12171
|
}
|
|
12172
12172
|
}
|
|
@@ -12198,7 +12198,7 @@ function analyzeRisks(entries, stats) {
|
|
|
12198
12198
|
title: "Drift Detected Without Therapy Response",
|
|
12199
12199
|
description: `${stats.driftEvents} drift events were detected but no therapy sessions were conducted during the audit period. Drift should trigger corrective therapy sessions.`,
|
|
12200
12200
|
evidence: [`${stats.driftEvents} drift events, 0 therapy sessions`],
|
|
12201
|
-
recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime
|
|
12201
|
+
recommendation: "Enable auto-evolve: holomime watch --evolve. Or manually run: holomime cure --personality .personality.json"
|
|
12202
12202
|
});
|
|
12203
12203
|
}
|
|
12204
12204
|
if (stats.totalEvents < 5) {
|