@evomap/evolver-core 2.0.0-beta.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/algo/antiDistill.d.ts +35 -0
- package/dist/algo/antiDistill.js +167 -0
- package/dist/algo/bans.d.ts +6 -0
- package/dist/algo/bans.js +33 -0
- package/dist/algo/candidateAssembly.d.ts +65 -0
- package/dist/algo/candidateAssembly.js +196 -0
- package/dist/algo/capabilityCandidates.d.ts +38 -0
- package/dist/algo/capabilityCandidates.js +131 -0
- package/dist/algo/confidence.d.ts +106 -0
- package/dist/algo/confidence.js +196 -0
- package/dist/algo/cycleEngine.d.ts +143 -0
- package/dist/algo/cycleEngine.js +417 -0
- package/dist/algo/cycleFailureClassifier.d.ts +52 -0
- package/dist/algo/cycleFailureClassifier.js +104 -0
- package/dist/algo/epigenetics.d.ts +14 -0
- package/dist/algo/epigenetics.js +41 -0
- package/dist/algo/evolutionEvent.d.ts +23 -0
- package/dist/algo/evolutionEvent.js +24 -0
- package/dist/algo/exploration.d.ts +34 -0
- package/dist/algo/exploration.js +55 -0
- package/dist/algo/geneHealth.d.ts +24 -0
- package/dist/algo/geneHealth.js +16 -0
- package/dist/algo/geneIntake.d.ts +37 -0
- package/dist/algo/geneIntake.js +100 -0
- package/dist/algo/genePromotion.d.ts +48 -0
- package/dist/algo/genePromotion.js +53 -0
- package/dist/algo/geneSelection.d.ts +128 -0
- package/dist/algo/geneSelection.js +222 -0
- package/dist/algo/index.d.ts +18 -0
- package/dist/algo/index.js +18 -0
- package/dist/algo/mutation.d.ts +12 -0
- package/dist/algo/mutation.js +22 -0
- package/dist/algo/orchestrator.d.ts +65 -0
- package/dist/algo/orchestrator.js +63 -0
- package/dist/algo/solidify.d.ts +43 -0
- package/dist/algo/solidify.js +63 -0
- package/dist/algo/strategyPresets.d.ts +32 -0
- package/dist/algo/strategyPresets.js +61 -0
- package/dist/assetstore/index.d.ts +8 -0
- package/dist/assetstore/index.js +8 -0
- package/dist/assetstore/learningHistory.d.ts +25 -0
- package/dist/assetstore/learningHistory.js +38 -0
- package/dist/assetstore/localJsonl.d.ts +34 -0
- package/dist/assetstore/localJsonl.js +182 -0
- package/dist/assetstore/pendingSignals.d.ts +22 -0
- package/dist/assetstore/pendingSignals.js +171 -0
- package/dist/assetstore/provenance.d.ts +39 -0
- package/dist/assetstore/provenance.js +109 -0
- package/dist/assetstore/provider.d.ts +48 -0
- package/dist/assetstore/provider.js +36 -0
- package/dist/assetstore/remoteStub.d.ts +32 -0
- package/dist/assetstore/remoteStub.js +36 -0
- package/dist/assetstore/reviewFilter.d.ts +20 -0
- package/dist/assetstore/reviewFilter.js +44 -0
- package/dist/assetstore/reviewLedger.d.ts +55 -0
- package/dist/assetstore/reviewLedger.js +121 -0
- package/dist/benchmark/antiGeneBenchmark.d.ts +79 -0
- package/dist/benchmark/antiGeneBenchmark.js +241 -0
- package/dist/benchmark/antiGeneRollout.d.ts +80 -0
- package/dist/benchmark/antiGeneRollout.js +256 -0
- package/dist/benchmark/benchmark.d.ts +32 -0
- package/dist/benchmark/benchmark.js +26 -0
- package/dist/benchmark/evolutionThesisSolver.d.ts +25 -0
- package/dist/benchmark/evolutionThesisSolver.js +41 -0
- package/dist/benchmark/index.d.ts +5 -0
- package/dist/benchmark/index.js +5 -0
- package/dist/benchmark/thesis.d.ts +85 -0
- package/dist/benchmark/thesis.js +150 -0
- package/dist/bootstrap/envFingerprint.d.ts +45 -0
- package/dist/bootstrap/envFingerprint.js +72 -0
- package/dist/bootstrap/index.d.ts +2 -0
- package/dist/bootstrap/index.js +2 -0
- package/dist/bootstrap/selfEvolve.d.ts +36 -0
- package/dist/bootstrap/selfEvolve.js +26 -0
- package/dist/cycle/cycleTimeline.d.ts +35 -0
- package/dist/cycle/cycleTimeline.js +74 -0
- package/dist/cycle/index.d.ts +2 -0
- package/dist/cycle/index.js +2 -0
- package/dist/cycle/stateMachine.d.ts +6 -0
- package/dist/cycle/stateMachine.js +25 -0
- package/dist/daemon/cycleContext.d.ts +12 -0
- package/dist/daemon/cycleContext.js +13 -0
- package/dist/daemon/drain.d.ts +11 -0
- package/dist/daemon/drain.js +16 -0
- package/dist/daemon/guards.d.ts +87 -0
- package/dist/daemon/guards.js +142 -0
- package/dist/daemon/idempotency.d.ts +11 -0
- package/dist/daemon/idempotency.js +36 -0
- package/dist/daemon/idleScheduler.d.ts +55 -0
- package/dist/daemon/idleScheduler.js +181 -0
- package/dist/daemon/index.d.ts +8 -0
- package/dist/daemon/index.js +8 -0
- package/dist/daemon/stepRunner.d.ts +12 -0
- package/dist/daemon/stepRunner.js +31 -0
- package/dist/daemon/unhandledRejectionWindow.d.ts +21 -0
- package/dist/daemon/unhandledRejectionWindow.js +52 -0
- package/dist/daemon/watchdog.d.ts +11 -0
- package/dist/daemon/watchdog.js +14 -0
- package/dist/events/eventSchema.d.ts +132 -0
- package/dist/events/eventSchema.js +30 -0
- package/dist/events/eventStore.d.ts +32 -0
- package/dist/events/eventStore.js +137 -0
- package/dist/events/ingest.d.ts +34 -0
- package/dist/events/ingest.js +61 -0
- package/dist/events/paths.d.ts +22 -0
- package/dist/events/paths.js +44 -0
- package/dist/events/projectors.d.ts +9 -0
- package/dist/events/projectors.js +11 -0
- package/dist/events/public.d.ts +14 -0
- package/dist/events/public.js +8 -0
- package/dist/events/replayer.d.ts +26 -0
- package/dist/events/replayer.js +67 -0
- package/dist/events/reports.d.ts +90 -0
- package/dist/events/reports.js +244 -0
- package/dist/events/retention.d.ts +70 -0
- package/dist/events/retention.js +177 -0
- package/dist/events/sink.d.ts +5 -0
- package/dist/events/sink.js +1 -0
- package/dist/exec/autoExec.d.ts +137 -0
- package/dist/exec/autoExec.js +221 -0
- package/dist/exec/autonomousCycle.d.ts +48 -0
- package/dist/exec/autonomousCycle.js +78 -0
- package/dist/exec/claudeBridge.d.ts +112 -0
- package/dist/exec/claudeBridge.js +219 -0
- package/dist/exec/index.d.ts +9 -0
- package/dist/exec/index.js +11 -0
- package/dist/exec/openPrRegistry.d.ts +60 -0
- package/dist/exec/openPrRegistry.js +130 -0
- package/dist/exec/policy/blastRadius.d.ts +31 -0
- package/dist/exec/policy/blastRadius.js +67 -0
- package/dist/exec/policy/constraints.d.ts +26 -0
- package/dist/exec/policy/constraints.js +62 -0
- package/dist/exec/policy/destructive.d.ts +45 -0
- package/dist/exec/policy/destructive.js +108 -0
- package/dist/exec/policy/failureMode.d.ts +33 -0
- package/dist/exec/policy/failureMode.js +49 -0
- package/dist/exec/policy/index.d.ts +24 -0
- package/dist/exec/policy/index.js +30 -0
- package/dist/exec/policy/protectedPaths.d.ts +17 -0
- package/dist/exec/policy/protectedPaths.js +65 -0
- package/dist/exec/policyCheck.d.ts +2 -0
- package/dist/exec/policyCheck.js +7 -0
- package/dist/exec/prompt.d.ts +34 -0
- package/dist/exec/prompt.js +108 -0
- package/dist/exec/proofOfWork.d.ts +9 -0
- package/dist/exec/proofOfWork.js +11 -0
- package/dist/exec/runnerRegistry.d.ts +123 -0
- package/dist/exec/runnerRegistry.js +237 -0
- package/dist/exec/selfPr.d.ts +83 -0
- package/dist/exec/selfPr.js +104 -0
- package/dist/exec/selfPrObfuscation.d.ts +21 -0
- package/dist/exec/selfPrObfuscation.js +85 -0
- package/dist/hooks/hooks.d.ts +117 -0
- package/dist/hooks/hooks.js +89 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hub/assetCallLog.d.ts +43 -0
- package/dist/hub/assetCallLog.js +72 -0
- package/dist/hub/bindings.d.ts +28 -0
- package/dist/hub/bindings.js +90 -0
- package/dist/hub/capability.d.ts +278 -0
- package/dist/hub/capability.js +1 -0
- package/dist/hub/conversationDistiller.d.ts +88 -0
- package/dist/hub/conversationDistiller.js +264 -0
- package/dist/hub/fake.d.ts +45 -0
- package/dist/hub/fake.js +69 -0
- package/dist/hub/hubReview.d.ts +91 -0
- package/dist/hub/hubReview.js +106 -0
- package/dist/hub/index.d.ts +10 -0
- package/dist/hub/index.js +10 -0
- package/dist/hub/ingest.d.ts +15 -0
- package/dist/hub/ingest.js +15 -0
- package/dist/hub/questionGenerator.d.ts +59 -0
- package/dist/hub/questionGenerator.js +406 -0
- package/dist/hub/reuseDecision.d.ts +87 -0
- package/dist/hub/reuseDecision.js +127 -0
- package/dist/hub/sanitize.d.ts +52 -0
- package/dist/hub/sanitize.js +321 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +27 -0
- package/dist/mailbox/catalog.d.ts +17 -0
- package/dist/mailbox/catalog.js +53 -0
- package/dist/mailbox/daemon.d.ts +48 -0
- package/dist/mailbox/daemon.js +61 -0
- package/dist/mailbox/dispatch.d.ts +46 -0
- package/dist/mailbox/dispatch.js +62 -0
- package/dist/mailbox/envelope.d.ts +43 -0
- package/dist/mailbox/envelope.js +52 -0
- package/dist/mailbox/index.d.ts +8 -0
- package/dist/mailbox/index.js +8 -0
- package/dist/mailbox/ipcServer.d.ts +46 -0
- package/dist/mailbox/ipcServer.js +168 -0
- package/dist/mailbox/requestReply.d.ts +40 -0
- package/dist/mailbox/requestReply.js +77 -0
- package/dist/mailbox/store.d.ts +74 -0
- package/dist/mailbox/store.js +308 -0
- package/dist/mailbox/wake.d.ts +45 -0
- package/dist/mailbox/wake.js +60 -0
- package/dist/material/boundary.d.ts +7 -0
- package/dist/material/boundary.js +14 -0
- package/dist/material/consumer.d.ts +21 -0
- package/dist/material/consumer.js +52 -0
- package/dist/material/emit.d.ts +55 -0
- package/dist/material/emit.js +52 -0
- package/dist/material/factory.d.ts +27 -0
- package/dist/material/factory.js +25 -0
- package/dist/material/index.d.ts +8 -0
- package/dist/material/index.js +8 -0
- package/dist/material/materialStore.d.ts +24 -0
- package/dist/material/materialStore.js +76 -0
- package/dist/material/sampling.d.ts +21 -0
- package/dist/material/sampling.js +39 -0
- package/dist/material/sources.d.ts +25 -0
- package/dist/material/sources.js +33 -0
- package/dist/material/watermark.d.ts +21 -0
- package/dist/material/watermark.js +76 -0
- package/dist/observers/cursorRewriteObserver.d.ts +46 -0
- package/dist/observers/cursorRewriteObserver.js +103 -0
- package/dist/observers/distillObserver.d.ts +31 -0
- package/dist/observers/distillObserver.js +93 -0
- package/dist/observers/index.d.ts +5 -0
- package/dist/observers/index.js +5 -0
- package/dist/observers/observerBus.d.ts +44 -0
- package/dist/observers/observerBus.js +73 -0
- package/dist/observers/reflectionObserver.d.ts +31 -0
- package/dist/observers/reflectionObserver.js +124 -0
- package/dist/observers/valueDigestObserver.d.ts +50 -0
- package/dist/observers/valueDigestObserver.js +70 -0
- package/dist/ops/cleanup.d.ts +23 -0
- package/dist/ops/cleanup.js +68 -0
- package/dist/ops/health.d.ts +37 -0
- package/dist/ops/health.js +96 -0
- package/dist/ops/index.d.ts +7 -0
- package/dist/ops/index.js +7 -0
- package/dist/ops/recall.d.ts +65 -0
- package/dist/ops/recall.js +152 -0
- package/dist/ops/reuseOutcomes.d.ts +68 -0
- package/dist/ops/reuseOutcomes.js +126 -0
- package/dist/ops/savingsCore.d.ts +47 -0
- package/dist/ops/savingsCore.js +112 -0
- package/dist/ops/selfUpdate.d.ts +106 -0
- package/dist/ops/selfUpdate.js +294 -0
- package/dist/ops/valueLedger.d.ts +205 -0
- package/dist/ops/valueLedger.js +238 -0
- package/dist/ops/valueOutreach.d.ts +70 -0
- package/dist/ops/valueOutreach.js +244 -0
- package/dist/personality/drift.d.ts +45 -0
- package/dist/personality/drift.js +106 -0
- package/dist/personality/events.d.ts +25 -0
- package/dist/personality/events.js +37 -0
- package/dist/personality/evolveOps.d.ts +20 -0
- package/dist/personality/evolveOps.js +93 -0
- package/dist/personality/index.d.ts +11 -0
- package/dist/personality/index.js +11 -0
- package/dist/personality/mutate.d.ts +21 -0
- package/dist/personality/mutate.js +39 -0
- package/dist/personality/pivot.d.ts +23 -0
- package/dist/personality/pivot.js +22 -0
- package/dist/personality/prompt.d.ts +6 -0
- package/dist/personality/prompt.js +62 -0
- package/dist/personality/riskGate.d.ts +42 -0
- package/dist/personality/riskGate.js +80 -0
- package/dist/personality/schema.d.ts +255 -0
- package/dist/personality/schema.js +119 -0
- package/dist/personality/select.d.ts +46 -0
- package/dist/personality/select.js +71 -0
- package/dist/personality/stats.d.ts +46 -0
- package/dist/personality/stats.js +82 -0
- package/dist/personality/store.d.ts +35 -0
- package/dist/personality/store.js +92 -0
- package/dist/schema/common.d.ts +28 -0
- package/dist/schema/common.js +17 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/material.d.ts +201 -0
- package/dist/schema/material.js +50 -0
- package/dist/schema/problem.d.ts +160 -0
- package/dist/schema/problem.js +45 -0
- package/dist/schema/proofOfWork.d.ts +97 -0
- package/dist/schema/proofOfWork.js +9 -0
- package/dist/schema/signal.d.ts +41 -0
- package/dist/schema/signal.js +19 -0
- package/dist/shadow/index.d.ts +6 -0
- package/dist/shadow/index.js +6 -0
- package/dist/shadow/jsonlSink.d.ts +17 -0
- package/dist/shadow/jsonlSink.js +27 -0
- package/dist/shadow/redact.d.ts +11 -0
- package/dist/shadow/redact.js +18 -0
- package/dist/shadow/shadowHub.d.ts +12 -0
- package/dist/shadow/shadowHub.js +42 -0
- package/dist/shadow/shadowMailbox.d.ts +17 -0
- package/dist/shadow/shadowMailbox.js +25 -0
- package/dist/shadow/shadowStore.d.ts +18 -0
- package/dist/shadow/shadowStore.js +55 -0
- package/dist/shadow/sink.d.ts +37 -0
- package/dist/shadow/sink.js +18 -0
- package/dist/signals/cycleHistoryFromEvents.d.ts +11 -0
- package/dist/signals/cycleHistoryFromEvents.js +96 -0
- package/dist/signals/expand.d.ts +34 -0
- package/dist/signals/expand.js +125 -0
- package/dist/signals/extractor.d.ts +25 -0
- package/dist/signals/extractor.js +57 -0
- package/dist/signals/index.d.ts +6 -0
- package/dist/signals/index.js +6 -0
- package/dist/signals/metaSignals.d.ts +57 -0
- package/dist/signals/metaSignals.js +158 -0
- package/dist/signals/signalGate.d.ts +15 -0
- package/dist/signals/signalGate.js +40 -0
- package/dist/signals/traceSignals.d.ts +44 -0
- package/dist/signals/traceSignals.js +123 -0
- package/dist/signatures/classifier.d.ts +16 -0
- package/dist/signatures/classifier.js +29 -0
- package/dist/signatures/index.d.ts +2 -0
- package/dist/signatures/index.js +2 -0
- package/dist/signatures/signatures.d.ts +22 -0
- package/dist/signatures/signatures.js +42 -0
- package/dist/strategy/experiment.d.ts +48 -0
- package/dist/strategy/experiment.js +63 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/strategyPoint.d.ts +30 -0
- package/dist/strategy/strategyPoint.js +23 -0
- package/dist/trace/index.d.ts +2 -0
- package/dist/trace/index.js +2 -0
- package/dist/trace/trajectory.d.ts +82 -0
- package/dist/trace/trajectory.js +117 -0
- package/dist/trace/trajectoryExport.d.ts +237 -0
- package/dist/trace/trajectoryExport.js +1818 -0
- package/dist/trigger/budget.d.ts +16 -0
- package/dist/trigger/budget.js +20 -0
- package/dist/trigger/engine.d.ts +12 -0
- package/dist/trigger/engine.js +23 -0
- package/dist/trigger/index.d.ts +6 -0
- package/dist/trigger/index.js +6 -0
- package/dist/trigger/problemBuilder.d.ts +24 -0
- package/dist/trigger/problemBuilder.js +32 -0
- package/dist/trigger/trigger.d.ts +22 -0
- package/dist/trigger/trigger.js +27 -0
- package/dist/trigger/valueModel.d.ts +26 -0
- package/dist/trigger/valueModel.js +25 -0
- package/dist/trigger/wfq.d.ts +13 -0
- package/dist/trigger/wfq.js +25 -0
- package/dist/util/fileLock.d.ts +24 -0
- package/dist/util/fileLock.js +227 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.js +2 -0
- package/dist/util/version.d.ts +12 -0
- package/dist/util/version.js +51 -0
- package/dist/verify/index.d.ts +4 -0
- package/dist/verify/index.js +4 -0
- package/dist/verify/rollback.d.ts +22 -0
- package/dist/verify/rollback.js +33 -0
- package/dist/verify/sandboxRunner.d.ts +39 -0
- package/dist/verify/sandboxRunner.js +116 -0
- package/dist/verify/sandboxedValidation.d.ts +35 -0
- package/dist/verify/sandboxedValidation.js +56 -0
- package/dist/verify/validation.d.ts +41 -0
- package/dist/verify/validation.js +85 -0
- package/dist/wire/canonicalize.golden.d.ts +23 -0
- package/dist/wire/canonicalize.golden.js +46 -0
- package/dist/wire/geneHints.d.ts +64 -0
- package/dist/wire/geneHints.js +100 -0
- package/dist/wire/index.d.ts +91 -0
- package/dist/wire/index.js +3 -0
- package/dist/wire/schemaGate.d.ts +11 -0
- package/dist/wire/schemaGate.js +49 -0
- package/dist/workflow/dsl.d.ts +54 -0
- package/dist/workflow/dsl.js +15 -0
- package/dist/workflow/engine.d.ts +30 -0
- package/dist/workflow/engine.js +94 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.js +2 -0
- package/package.json +29 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { normalizePersonalityState } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 何时/如何小步变异人格 (v1 proposeMutations / shouldTriggerPersonalityMutation + mutation.js 的信号判定端口).
|
|
4
|
+
* 这是"自调参"的规则引擎: 根据信号/失败连击提出对人格向量的小 nudge, 由 applyPersonalityMutations 落地.
|
|
5
|
+
*/
|
|
6
|
+
/** 机会信号: 表示"有创新余地"而非只是修 bug (v1 OPPORTUNITY_SIGNALS). */
|
|
7
|
+
export const OPPORTUNITY_SIGNALS = [
|
|
8
|
+
'user_feature_request',
|
|
9
|
+
'user_improvement_suggestion',
|
|
10
|
+
'perf_bottleneck',
|
|
11
|
+
'capability_gap',
|
|
12
|
+
'stable_success_plateau',
|
|
13
|
+
'external_opportunity',
|
|
14
|
+
'recurring_error',
|
|
15
|
+
'unsupported_input_type',
|
|
16
|
+
'evolution_stagnation_detected',
|
|
17
|
+
'repair_loop_detected',
|
|
18
|
+
'force_innovation_after_repair_loop',
|
|
19
|
+
'tool_bypass',
|
|
20
|
+
'curriculum_target',
|
|
21
|
+
'issue_already_resolved',
|
|
22
|
+
'openclaw_self_healed',
|
|
23
|
+
'empty_cycle_loop_detected',
|
|
24
|
+
];
|
|
25
|
+
const ERROR_INDICATORS = ['log_error', 'error', 'exception', 'failed', 'unstable'];
|
|
26
|
+
function asStrings(signals) {
|
|
27
|
+
return Array.isArray(signals) ? signals.map((s) => String(s ?? '')) : [];
|
|
28
|
+
}
|
|
29
|
+
/** signals 里是否有机会信号 (精确名或 `name:` 前缀). */
|
|
30
|
+
export function hasOpportunitySignal(signals) {
|
|
31
|
+
const list = asStrings(signals);
|
|
32
|
+
return OPPORTUNITY_SIGNALS.some((name) => list.includes(name) || list.some((s) => s.startsWith(`${name}:`)));
|
|
33
|
+
}
|
|
34
|
+
/** signals 里是否有错误类信号 (但 issue_already_resolved / openclaw_self_healed 例外为 false). */
|
|
35
|
+
export function hasErrorishSignal(signals) {
|
|
36
|
+
const list = asStrings(signals);
|
|
37
|
+
if (list.includes('issue_already_resolved') || list.includes('openclaw_self_healed'))
|
|
38
|
+
return false;
|
|
39
|
+
return list.some((sig) => {
|
|
40
|
+
const s = sig.toLowerCase();
|
|
41
|
+
return ERROR_INDICATORS.includes(s) || s.startsWith('errsig:') || s.startsWith('errsig_norm:');
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 依上下文提出一组人格变异 (v1 proposeMutations). 分支优先级:
|
|
46
|
+
* drift → 提创造性(风险回夹) / protocol_drift → 提服从&严谨 / 错误 → 提严谨降风险 /
|
|
47
|
+
* 机会 → 提创造性&风险 / 否则(平台期) → 微提创造性降啰嗦.
|
|
48
|
+
* 若 obedience 已饱和(≥0.95), 把服从类变异换成创造性.
|
|
49
|
+
*/
|
|
50
|
+
export function proposeMutations(input) {
|
|
51
|
+
const s = normalizePersonalityState(input.baseState);
|
|
52
|
+
const sig = asStrings(input.signals);
|
|
53
|
+
const r = String(input.reason ?? '');
|
|
54
|
+
const mk = (param, delta, reason) => ({ type: 'PersonalityMutation', param, delta, reason });
|
|
55
|
+
const muts = [];
|
|
56
|
+
if (input.driftEnabled) {
|
|
57
|
+
muts.push(mk('creativity', +0.1, r || 'drift enabled'));
|
|
58
|
+
muts.push(mk('risk_tolerance', -0.05, 'drift safety clamp'));
|
|
59
|
+
}
|
|
60
|
+
else if (sig.includes('protocol_drift')) {
|
|
61
|
+
muts.push(mk('obedience', +0.1, r || 'protocol drift'));
|
|
62
|
+
muts.push(mk('rigor', +0.05, 'tighten protocol compliance'));
|
|
63
|
+
}
|
|
64
|
+
else if (sig.includes('log_error') || sig.some((x) => x.startsWith('errsig:') || x.startsWith('errsig_norm:'))) {
|
|
65
|
+
muts.push(mk('rigor', +0.1, r || 'repair instability'));
|
|
66
|
+
muts.push(mk('risk_tolerance', -0.1, 'reduce risky changes under errors'));
|
|
67
|
+
}
|
|
68
|
+
else if (hasOpportunitySignal(sig)) {
|
|
69
|
+
muts.push(mk('creativity', +0.1, r || 'opportunity signal detected'));
|
|
70
|
+
muts.push(mk('risk_tolerance', +0.05, 'allow exploration for innovation'));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
muts.push(mk('creativity', +0.05, r || 'plateau creativity nudge'));
|
|
74
|
+
muts.push(mk('verbosity', -0.05, 'reduce noise'));
|
|
75
|
+
}
|
|
76
|
+
if (s.obedience >= 0.95) {
|
|
77
|
+
const idx = muts.findIndex((m) => m.param === 'obedience');
|
|
78
|
+
if (idx >= 0)
|
|
79
|
+
muts[idx] = mk('creativity', +0.05, 'obedience saturated');
|
|
80
|
+
}
|
|
81
|
+
return muts;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 是否该触发一次人格变异 (v1 shouldTriggerPersonalityMutation):
|
|
85
|
+
* - driftEnabled ⇒ 总触发
|
|
86
|
+
* - 最近 6 事件里, 后 4 个有 ≥3 个 failed ⇒ 长失败连击
|
|
87
|
+
* - 带 mutation_id 的最近 3 个事件全 failed ⇒ 变异连续失败
|
|
88
|
+
*/
|
|
89
|
+
export function shouldTriggerPersonalityMutation(args) {
|
|
90
|
+
if (args.driftEnabled)
|
|
91
|
+
return { ok: true, reason: 'drift enabled' };
|
|
92
|
+
const tail = (Array.isArray(args.recentEvents) ? args.recentEvents : []).slice(-6);
|
|
93
|
+
const outcomes = tail.map((e) => (e?.outcome?.status ? String(e.outcome.status) : null)).filter((x) => x != null);
|
|
94
|
+
if (outcomes.length >= 4) {
|
|
95
|
+
const recentFailed = outcomes.slice(-4).filter((x) => x === 'failed').length;
|
|
96
|
+
if (recentFailed >= 3)
|
|
97
|
+
return { ok: true, reason: 'long failure streak' };
|
|
98
|
+
}
|
|
99
|
+
const withMut = tail.filter((e) => typeof e?.mutationId === 'string' && e.mutationId);
|
|
100
|
+
if (withMut.length >= 3) {
|
|
101
|
+
const fail3 = withMut.slice(-3).filter((e) => e?.outcome?.status === 'failed').length;
|
|
102
|
+
if (fail3 >= 3)
|
|
103
|
+
return { ok: true, reason: 'mutation consecutive failures' };
|
|
104
|
+
}
|
|
105
|
+
return { ok: false, reason: '' };
|
|
106
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Ingestor } from '../events/ingest.js';
|
|
2
|
+
import type { RootEvent } from '../events/eventSchema.js';
|
|
3
|
+
import { type PersonalityState } from './schema.js';
|
|
4
|
+
import type { GateResult } from './riskGate.js';
|
|
5
|
+
/**
|
|
6
|
+
* PersonalityState 用途③(可审计): 人格相关变更进事件流.
|
|
7
|
+
* 这里只覆盖 PR-1 两类事件 —— 选定人格 / 风险闸降级; 统计回写与 pivot 属 PR-2.
|
|
8
|
+
* 传薄 Ingestor 接口 (只用 ingest), 不反向依赖 cycleEngine.
|
|
9
|
+
*/
|
|
10
|
+
export type PersonalityIngestor = Pick<Ingestor, 'ingest'>;
|
|
11
|
+
/** 记录本轮选用的人格状态 (注入 prompt 前). */
|
|
12
|
+
export declare function emitPersonalitySelected(ingestor: PersonalityIngestor, args: {
|
|
13
|
+
cycleId: string;
|
|
14
|
+
personality: PersonalityState;
|
|
15
|
+
known: boolean;
|
|
16
|
+
}): Promise<RootEvent>;
|
|
17
|
+
/**
|
|
18
|
+
* 记录风险闸对变异的降级 (仅当真降级了才发; downgraded=false 不发).
|
|
19
|
+
* why 必填 —— 让"Why 面板"能解释这次变异为何被压。
|
|
20
|
+
*/
|
|
21
|
+
export declare function emitPersonalityRiskGated(ingestor: PersonalityIngestor, args: {
|
|
22
|
+
cycleId: string;
|
|
23
|
+
personality: PersonalityState;
|
|
24
|
+
gate: GateResult;
|
|
25
|
+
}): Promise<RootEvent | null>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { personalityKey } from './schema.js';
|
|
2
|
+
/** 记录本轮选用的人格状态 (注入 prompt 前). */
|
|
3
|
+
export async function emitPersonalitySelected(ingestor, args) {
|
|
4
|
+
const key = personalityKey(args.personality);
|
|
5
|
+
return ingestor.ingest({
|
|
6
|
+
type: 'personality.selected',
|
|
7
|
+
human: {
|
|
8
|
+
title: `人格 ${key}`,
|
|
9
|
+
detail: `rigor=${args.personality.rigor.toFixed(2)} creativity=${args.personality.creativity.toFixed(2)} risk=${args.personality.risk_tolerance.toFixed(2)}`,
|
|
10
|
+
},
|
|
11
|
+
payload: { cycleId: args.cycleId, personalityKey: key, personalityState: args.personality, known: args.known },
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 记录风险闸对变异的降级 (仅当真降级了才发; downgraded=false 不发).
|
|
16
|
+
* why 必填 —— 让"Why 面板"能解释这次变异为何被压。
|
|
17
|
+
*/
|
|
18
|
+
export async function emitPersonalityRiskGated(ingestor, args) {
|
|
19
|
+
if (!args.gate.downgraded)
|
|
20
|
+
return null;
|
|
21
|
+
const m = args.gate.mutation;
|
|
22
|
+
return ingestor.ingest({
|
|
23
|
+
type: 'personality.risk_gated',
|
|
24
|
+
human: {
|
|
25
|
+
title: `风险闸降级 → ${m.category}/${m.risk_level}`,
|
|
26
|
+
why: `人格 ${personalityKey(args.personality)} 未满足高危放行 (rigor≥0.6 且 risk_tolerance≤0.5); 安全信号: ${args.gate.appliedSignals.join(', ')}`,
|
|
27
|
+
severity: 'notice',
|
|
28
|
+
},
|
|
29
|
+
payload: {
|
|
30
|
+
cycleId: args.cycleId,
|
|
31
|
+
mutationId: m.id,
|
|
32
|
+
category: m.category,
|
|
33
|
+
riskLevel: m.risk_level,
|
|
34
|
+
appliedSignals: args.gate.appliedSignals,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RootEvent } from '../events/eventSchema.js';
|
|
2
|
+
import type { PersonalityIngestor } from './events.js';
|
|
3
|
+
import type { PersonalityStore } from './store.js';
|
|
4
|
+
import { type SelectInput, type SelectResult } from './select.js';
|
|
5
|
+
import { type UpdateStatsInput, type UpdateStatsResult } from './stats.js';
|
|
6
|
+
import { type ForcePivotInput, type ForcePivotResult } from './pivot.js';
|
|
7
|
+
export interface EvolveDeps {
|
|
8
|
+
store: PersonalityStore;
|
|
9
|
+
/** 可选: 传了就把变更记进事件流 (personality.mutated / stats_updated / pivoted). */
|
|
10
|
+
ingestor?: PersonalityIngestor;
|
|
11
|
+
/** 关联的 cycle (进 payload, 便于回溯). */
|
|
12
|
+
cycleId?: string;
|
|
13
|
+
}
|
|
14
|
+
/** 每轮开始: 选人格 (自然选择 + 触发变异), 落盘, 发 personality.mutated (仅当真有变异). */
|
|
15
|
+
export declare function applySelectForRun(deps: EvolveDeps, input?: SelectInput): Promise<SelectResult>;
|
|
16
|
+
/** 每轮结束: 把 outcome/score 回写到对应人格桶, 落盘, 发 personality.stats_updated. */
|
|
17
|
+
export declare function applyStatsUpdate(deps: EvolveDeps, input: UpdateStatsInput): Promise<UpdateStatsResult>;
|
|
18
|
+
/** 平台期: 强制转向到探索模式, 落盘, 发 personality.pivoted. */
|
|
19
|
+
export declare function applyForcePivot(deps: EvolveDeps, input: Omit<ForcePivotInput, 'base'>): Promise<ForcePivotResult>;
|
|
20
|
+
export type { RootEvent };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { selectPersonalityForRun } from './select.js';
|
|
2
|
+
import { updatePersonalityStats } from './stats.js';
|
|
3
|
+
import { forcePivot } from './pivot.js';
|
|
4
|
+
import { personalityKey } from './schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* store-backed 进化算子 (PR-2): 把纯函数 select/stats/pivot 接到持久化 + 事件流.
|
|
7
|
+
* 每个算子: load model → 跑纯函数 → save → emit 事件 (可审计). 事件 emit best-effort, 不阻断进化.
|
|
8
|
+
*/
|
|
9
|
+
/** 事件 human.title 有 80 字上限 (humanNarrative schema); personalityKey 约 65 字, 塞不进标题.
|
|
10
|
+
* 标题只放紧凑摘要 (rigor/creativity/risk 三主轴), 完整 key + 全状态进 payload. */
|
|
11
|
+
function briefState(s) {
|
|
12
|
+
return `r${s.rigor.toFixed(1)} c${s.creativity.toFixed(1)} k${s.risk_tolerance.toFixed(1)}`;
|
|
13
|
+
}
|
|
14
|
+
/** 每轮开始: 选人格 (自然选择 + 触发变异), 落盘, 发 personality.mutated (仅当真有变异). */
|
|
15
|
+
export async function applySelectForRun(deps, input = {}) {
|
|
16
|
+
const model = deps.store.load();
|
|
17
|
+
const result = selectPersonalityForRun(model, input);
|
|
18
|
+
deps.store.save(result.model);
|
|
19
|
+
if (deps.ingestor && result.mutations.length > 0) {
|
|
20
|
+
await deps.ingestor.ingest({
|
|
21
|
+
type: 'personality.mutated',
|
|
22
|
+
human: {
|
|
23
|
+
title: `人格自调参 (${briefState(result.state)})`,
|
|
24
|
+
why: result.meta.triggered
|
|
25
|
+
? `触发变异: ${result.meta.triggered.reason}${result.meta.bestKnownKey ? `; 向最佳桶 ${result.meta.bestKnownKey} 靠拢` : ''}`
|
|
26
|
+
: `向最佳已知桶 ${result.meta.bestKnownKey} 靠拢 (自然选择)`,
|
|
27
|
+
severity: 'notice',
|
|
28
|
+
},
|
|
29
|
+
payload: {
|
|
30
|
+
cycleId: deps.cycleId ?? null,
|
|
31
|
+
personalityKey: result.key,
|
|
32
|
+
personalityState: result.state,
|
|
33
|
+
mutations: result.mutations,
|
|
34
|
+
meta: result.meta,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/** 每轮结束: 把 outcome/score 回写到对应人格桶, 落盘, 发 personality.stats_updated. */
|
|
41
|
+
export async function applyStatsUpdate(deps, input) {
|
|
42
|
+
const model = deps.store.load();
|
|
43
|
+
const result = updatePersonalityStats(model, input, deps.store.nowIso());
|
|
44
|
+
deps.store.save(result.model);
|
|
45
|
+
if (deps.ingestor) {
|
|
46
|
+
await deps.ingestor.ingest({
|
|
47
|
+
type: 'personality.stats_updated',
|
|
48
|
+
human: { title: `人格统计回写 ${String(input.outcome)} (${result.entry.success}✓/${result.entry.fail}✗)` },
|
|
49
|
+
payload: {
|
|
50
|
+
cycleId: deps.cycleId ?? null,
|
|
51
|
+
personalityKey: result.key,
|
|
52
|
+
outcome: String(input.outcome),
|
|
53
|
+
score: input.score ?? null,
|
|
54
|
+
entry: result.entry,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/** 平台期: 强制转向到探索模式, 落盘, 发 personality.pivoted. */
|
|
61
|
+
export async function applyForcePivot(deps, input) {
|
|
62
|
+
const model = deps.store.load();
|
|
63
|
+
const result = forcePivot({ ...input, base: model.current });
|
|
64
|
+
const at = deps.store.nowIso();
|
|
65
|
+
const key = personalityKey(result.state);
|
|
66
|
+
deps.store.save({
|
|
67
|
+
...model,
|
|
68
|
+
current: result.state,
|
|
69
|
+
history: [
|
|
70
|
+
...model.history,
|
|
71
|
+
{ at, key, outcome: `pivot_${result.severity}`, score: null, notes: `Forced pivot after ${input.evalsSinceImprovement ?? 0} non-improving evals` },
|
|
72
|
+
],
|
|
73
|
+
});
|
|
74
|
+
if (deps.ingestor) {
|
|
75
|
+
await deps.ingestor.ingest({
|
|
76
|
+
type: 'personality.pivoted',
|
|
77
|
+
human: {
|
|
78
|
+
title: `人格强制转向 ${result.severity} (${briefState(result.state)})`,
|
|
79
|
+
why: `平台期 ${input.evalsSinceImprovement ?? 0} 轮无改进; 拉高 creativity/risk_tolerance 进入探索`,
|
|
80
|
+
severity: result.severity === 'required' ? 'warn' : 'notice',
|
|
81
|
+
},
|
|
82
|
+
payload: {
|
|
83
|
+
cycleId: deps.cycleId ?? null,
|
|
84
|
+
severity: result.severity,
|
|
85
|
+
evalsSinceImprovement: input.evalsSinceImprovement ?? 0,
|
|
86
|
+
personalityKey: key,
|
|
87
|
+
personalityState: result.state,
|
|
88
|
+
mutations: result.mutations,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './schema.js';
|
|
2
|
+
export * from './mutate.js';
|
|
3
|
+
export * from './riskGate.js';
|
|
4
|
+
export * from './prompt.js';
|
|
5
|
+
export * from './store.js';
|
|
6
|
+
export * from './events.js';
|
|
7
|
+
export * from './stats.js';
|
|
8
|
+
export * from './drift.js';
|
|
9
|
+
export * from './pivot.js';
|
|
10
|
+
export * from './select.js';
|
|
11
|
+
export * from './evolveOps.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './schema.js';
|
|
2
|
+
export * from './mutate.js';
|
|
3
|
+
export * from './riskGate.js';
|
|
4
|
+
export * from './prompt.js';
|
|
5
|
+
export * from './store.js';
|
|
6
|
+
export * from './events.js';
|
|
7
|
+
export * from './stats.js';
|
|
8
|
+
export * from './drift.js';
|
|
9
|
+
export * from './pivot.js';
|
|
10
|
+
export * from './select.js';
|
|
11
|
+
export * from './evolveOps.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type PersonalityMutation, type PersonalityState } from './schema.js';
|
|
2
|
+
/** 单次变异的最大幅度 (v1 硬夹, 防人格被一步推飞). */
|
|
3
|
+
export declare const MAX_MUTATION_DELTA = 0.2;
|
|
4
|
+
/** 单次 apply 最多落地几条变异 (v1: 每周期最多 2 条, 防漂移). */
|
|
5
|
+
export declare const MAX_MUTATIONS_PER_APPLY = 2;
|
|
6
|
+
export interface AppliedMutation extends PersonalityMutation {
|
|
7
|
+
type: 'PersonalityMutation';
|
|
8
|
+
}
|
|
9
|
+
export interface ApplyResult {
|
|
10
|
+
state: PersonalityState;
|
|
11
|
+
applied: AppliedMutation[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 把一组变异提案落到人格状态上 (v1 applyPersonalityMutations 端口).
|
|
15
|
+
* - 只认合法轴, 非数 delta 跳过
|
|
16
|
+
* - 每条 delta 夹到 ±MAX_MUTATION_DELTA
|
|
17
|
+
* - 落地后每轴仍夹回 [0,1]
|
|
18
|
+
* - 最多落 MAX_MUTATIONS_PER_APPLY 条 (超出忽略)
|
|
19
|
+
* 纯函数: 不改入参, 返回新状态 + 实际落地的变异列表.
|
|
20
|
+
*/
|
|
21
|
+
export declare function applyPersonalityMutations(state: unknown, mutations: readonly PersonalityMutation[] | undefined): ApplyResult;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { clamp01, normalizePersonalityState, } from './schema.js';
|
|
2
|
+
/** 单次变异的最大幅度 (v1 硬夹, 防人格被一步推飞). */
|
|
3
|
+
export const MAX_MUTATION_DELTA = 0.2;
|
|
4
|
+
/** 单次 apply 最多落地几条变异 (v1: 每周期最多 2 条, 防漂移). */
|
|
5
|
+
export const MAX_MUTATIONS_PER_APPLY = 2;
|
|
6
|
+
/**
|
|
7
|
+
* 把一组变异提案落到人格状态上 (v1 applyPersonalityMutations 端口).
|
|
8
|
+
* - 只认合法轴, 非数 delta 跳过
|
|
9
|
+
* - 每条 delta 夹到 ±MAX_MUTATION_DELTA
|
|
10
|
+
* - 落地后每轴仍夹回 [0,1]
|
|
11
|
+
* - 最多落 MAX_MUTATIONS_PER_APPLY 条 (超出忽略)
|
|
12
|
+
* 纯函数: 不改入参, 返回新状态 + 实际落地的变异列表.
|
|
13
|
+
*/
|
|
14
|
+
export function applyPersonalityMutations(state, mutations) {
|
|
15
|
+
const cur = normalizePersonalityState(state);
|
|
16
|
+
const applied = [];
|
|
17
|
+
for (const m of mutations ?? []) {
|
|
18
|
+
if (applied.length >= MAX_MUTATIONS_PER_APPLY)
|
|
19
|
+
break;
|
|
20
|
+
if (!m || typeof m !== 'object')
|
|
21
|
+
continue;
|
|
22
|
+
const param = m.param;
|
|
23
|
+
// param 是五轴枚举 (schema z.enum(PERSONALITY_AXES)) — 天然排除 'type'; in 检查兜底手改数据.
|
|
24
|
+
if (!(param in cur))
|
|
25
|
+
continue;
|
|
26
|
+
const delta = Number(m.delta);
|
|
27
|
+
if (!Number.isFinite(delta))
|
|
28
|
+
continue;
|
|
29
|
+
const clipped = Math.max(-MAX_MUTATION_DELTA, Math.min(MAX_MUTATION_DELTA, delta));
|
|
30
|
+
cur[param] = clamp01(cur[param] + clipped);
|
|
31
|
+
applied.push({
|
|
32
|
+
type: 'PersonalityMutation',
|
|
33
|
+
param,
|
|
34
|
+
delta: clipped,
|
|
35
|
+
reason: String(m.reason ?? '').slice(0, 140),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return { state: cur, applied };
|
|
39
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AppliedMutation } from './mutate.js';
|
|
2
|
+
import { type PersonalityState, type PersonalityStateInput } from './schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* 平台期强制转向 (v1 forcePivot 端口): 检测到长期无改进时, 临时拉高创造性 + 风险容忍进入探索模式.
|
|
5
|
+
* 纯函数 —— 返回新状态 + 实际落地的变异 (仍受 applyPersonalityMutations 的 ±0.2 夹取与最多 2 条约束);
|
|
6
|
+
* 是否持久化 / 记事件由调用方 (orchestrator / cycleEngine 接线) 决定.
|
|
7
|
+
*/
|
|
8
|
+
export type PivotSeverity = 'suggested' | 'required';
|
|
9
|
+
export interface ForcePivotInput {
|
|
10
|
+
base: PersonalityStateInput;
|
|
11
|
+
severity?: PivotSeverity;
|
|
12
|
+
evalsSinceImprovement?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ForcePivotResult {
|
|
15
|
+
state: PersonalityState;
|
|
16
|
+
mutations: AppliedMutation[];
|
|
17
|
+
severity: PivotSeverity;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* required: creativity +0.2 / risk_tolerance +0.15 (更激进)
|
|
21
|
+
* suggested: creativity +0.15 / risk_tolerance +0.1
|
|
22
|
+
*/
|
|
23
|
+
export declare function forcePivot(input: ForcePivotInput): ForcePivotResult;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { applyPersonalityMutations } from './mutate.js';
|
|
2
|
+
import { normalizePersonalityState } from './schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* required: creativity +0.2 / risk_tolerance +0.15 (更激进)
|
|
5
|
+
* suggested: creativity +0.15 / risk_tolerance +0.1
|
|
6
|
+
*/
|
|
7
|
+
export function forcePivot(input) {
|
|
8
|
+
const severity = input.severity === 'required' ? 'required' : 'suggested';
|
|
9
|
+
const evals = Number(input.evalsSinceImprovement) || 0;
|
|
10
|
+
const mk = (param, delta, reason) => ({ type: 'PersonalityMutation', param, delta, reason });
|
|
11
|
+
const proposals = severity === 'required'
|
|
12
|
+
? [
|
|
13
|
+
mk('creativity', +0.2, `forced_pivot_required (plateau ${evals} evals)`),
|
|
14
|
+
mk('risk_tolerance', +0.15, 'forced_pivot_exploration'),
|
|
15
|
+
]
|
|
16
|
+
: [
|
|
17
|
+
mk('creativity', +0.15, `pivot_suggested (plateau ${evals} evals)`),
|
|
18
|
+
mk('risk_tolerance', +0.1, 'pivot_exploration_nudge'),
|
|
19
|
+
];
|
|
20
|
+
const { state, applied } = applyPersonalityMutations(normalizePersonalityState(input.base), proposals);
|
|
21
|
+
return { state, mutations: applied, severity };
|
|
22
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type PersonalityStateInput } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 渲染人格块 (markdown), 供 renderExecPrompt 拼进 agent 指令.
|
|
4
|
+
* 末行显式声明高危变异是否被人格放行, 让 agent 与风险闸看到同一事实.
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderPersonalityBlock(personality: PersonalityStateInput | null | undefined): string;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { normalizePersonalityState } from './schema.js';
|
|
2
|
+
import { isHighRiskMutationAllowed } from './riskGate.js';
|
|
3
|
+
/**
|
|
4
|
+
* PersonalityState 用途①: 注入每轮 GEP prompt, 决定进化"风格" (v1 src/gep/prompt.js 的人格块端口).
|
|
5
|
+
*
|
|
6
|
+
* 把 0..1 数值向量翻译成 agent 能照做的行为指令 —— 只影响"怎么做"(严谨/激进/啰嗦),
|
|
7
|
+
* 不改"做什么". 纯函数, 同输入同输出 (对齐 renderExecPrompt 的确定性契约).
|
|
8
|
+
*/
|
|
9
|
+
/** 三档定性: 数值 → low/mid/high (阈值与 v1 语感一致). */
|
|
10
|
+
function band(x) {
|
|
11
|
+
if (x < 0.34)
|
|
12
|
+
return 'low';
|
|
13
|
+
if (x < 0.67)
|
|
14
|
+
return 'mid';
|
|
15
|
+
return 'high';
|
|
16
|
+
}
|
|
17
|
+
const RIGOR_HINT = {
|
|
18
|
+
low: 'move fast; skip exhaustive checks unless correctness is at stake',
|
|
19
|
+
mid: 'balance speed with verification',
|
|
20
|
+
high: 'be protocol-first and conservative; verify assumptions before acting',
|
|
21
|
+
};
|
|
22
|
+
const CREATIVITY_HINT = {
|
|
23
|
+
low: 'prefer the smallest proven change; do not explore alternatives',
|
|
24
|
+
mid: 'consider one alternative if the obvious path is weak',
|
|
25
|
+
high: 'actively explore novel approaches to escape local optima',
|
|
26
|
+
};
|
|
27
|
+
const VERBOSITY_HINT = {
|
|
28
|
+
low: 'keep output terse — minimal prose, no filler',
|
|
29
|
+
mid: 'explain the key decisions briefly',
|
|
30
|
+
high: 'document reasoning and trade-offs in detail',
|
|
31
|
+
};
|
|
32
|
+
const RISK_HINT = {
|
|
33
|
+
low: 'avoid risky or wide-reaching edits; stay well inside the blast radius',
|
|
34
|
+
mid: 'take bounded risks when the payoff is clear',
|
|
35
|
+
high: 'willing to take larger risks (subject to the safety gate)',
|
|
36
|
+
};
|
|
37
|
+
const OBEDIENCE_HINT = {
|
|
38
|
+
low: 'use judgment freely; deviate from convention when warranted',
|
|
39
|
+
mid: 'follow instructions, deviating only with good reason',
|
|
40
|
+
high: 'adhere strictly to instructions and established protocol',
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 渲染人格块 (markdown), 供 renderExecPrompt 拼进 agent 指令.
|
|
44
|
+
* 末行显式声明高危变异是否被人格放行, 让 agent 与风险闸看到同一事实.
|
|
45
|
+
*/
|
|
46
|
+
export function renderPersonalityBlock(personality) {
|
|
47
|
+
const p = normalizePersonalityState(personality ?? {});
|
|
48
|
+
const pct = (n) => `${Math.round(n * 100)}%`;
|
|
49
|
+
const highRiskAllowed = isHighRiskMutationAllowed(p);
|
|
50
|
+
return [
|
|
51
|
+
'## Evolution style (personality)',
|
|
52
|
+
'Apply this behavioral posture to HOW you make the change (not what the change is):',
|
|
53
|
+
`- Rigor ${pct(p.rigor)}: ${RIGOR_HINT[band(p.rigor)]}`,
|
|
54
|
+
`- Creativity ${pct(p.creativity)}: ${CREATIVITY_HINT[band(p.creativity)]}`,
|
|
55
|
+
`- Verbosity ${pct(p.verbosity)}: ${VERBOSITY_HINT[band(p.verbosity)]}`,
|
|
56
|
+
`- Risk tolerance ${pct(p.risk_tolerance)}: ${RISK_HINT[band(p.risk_tolerance)]}`,
|
|
57
|
+
`- Obedience ${pct(p.obedience)}: ${OBEDIENCE_HINT[band(p.obedience)]}`,
|
|
58
|
+
highRiskAllowed
|
|
59
|
+
? 'High-risk mutations are PERMITTED by the current personality (rigor≥0.6 and risk_tolerance≤0.5).'
|
|
60
|
+
: 'High-risk mutations are NOT permitted by the current personality — keep changes low/medium risk.',
|
|
61
|
+
].join('\n');
|
|
62
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Mutation } from '../wire/index.js';
|
|
2
|
+
import { type PersonalityStateInput } from './schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* 变异风险闸 (v1 src/gep/mutation.js 的 isHighRiskPersonality / isHighRiskMutationAllowed 端口).
|
|
5
|
+
* PersonalityState 用途②: 决定敢不敢放行高危/创新变异.
|
|
6
|
+
*/
|
|
7
|
+
/** rigor 低于此值即视为"高危人格". */
|
|
8
|
+
export declare const HIGH_RISK_RIGOR_FLOOR = 0.5;
|
|
9
|
+
/** risk_tolerance 高于此值即视为"高危人格". */
|
|
10
|
+
export declare const HIGH_RISK_TOLERANCE_CEIL = 0.6;
|
|
11
|
+
/** 放行 high-risk 变异要求的 rigor 下限. */
|
|
12
|
+
export declare const ALLOW_HIGH_RISK_RIGOR_MIN = 0.6;
|
|
13
|
+
/** 放行 high-risk 变异要求的 risk_tolerance 上限. */
|
|
14
|
+
export declare const ALLOW_HIGH_RISK_TOLERANCE_MAX = 0.5;
|
|
15
|
+
/**
|
|
16
|
+
* 保守定义: rigor 过低 或 risk_tolerance 过高 → 高危人格.
|
|
17
|
+
* 缺省(无人格)返回 false — 无信息不主动扣帽子, 交由下游默认策略.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isHighRiskPersonality(p: PersonalityStateInput | null | undefined): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* high-risk 变异只在 rigor≥0.6 且 risk_tolerance≤0.5 放行 (任务用途②的硬阈值).
|
|
22
|
+
* 缺省(无人格)时按最保守假设处理: rigor=0, risk_tolerance=1 → 不放行.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isHighRiskMutationAllowed(p: PersonalityStateInput | null | undefined): boolean;
|
|
25
|
+
/** 安全信号: 追加到 Mutation.trigger_signals, 使降级在事件流里可审计. */
|
|
26
|
+
export declare const SAFETY_SIGNAL_AVOID_INNOVATE = "safety:avoid_innovate_with_high_risk_personality";
|
|
27
|
+
export declare const SAFETY_SIGNAL_DOWNGRADE_HIGH_RISK = "safety:downgrade_high_risk";
|
|
28
|
+
export interface GateResult {
|
|
29
|
+
/** 经风险闸处理后的变异 (可能被降级); 原 mutation 不被改动. */
|
|
30
|
+
mutation: Mutation;
|
|
31
|
+
/** 是否发生降级. */
|
|
32
|
+
downgraded: boolean;
|
|
33
|
+
/** 追加的安全信号 (人类可读, 也进事件流). */
|
|
34
|
+
appliedSignals: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 对一条待执行的变异施加人格风险闸 (v1 buildMutation 内两条硬安全约束的端口):
|
|
38
|
+
* 1. innovate + 高危人格 → 降级为 optimize/low (禁"高危人格 + 创新"组合)
|
|
39
|
+
* 2. high-risk 且人格不满足放行阈值 → 降一档到 medium
|
|
40
|
+
* 纯函数, 返回新 Mutation. cycleEngine 在 buildMutation 后调用它, 再 ingest mutation.built.
|
|
41
|
+
*/
|
|
42
|
+
export declare function gatePersonalityRisk(mutation: Mutation, personality: PersonalityStateInput | null | undefined): GateResult;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { normalizePersonalityState } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 变异风险闸 (v1 src/gep/mutation.js 的 isHighRiskPersonality / isHighRiskMutationAllowed 端口).
|
|
4
|
+
* PersonalityState 用途②: 决定敢不敢放行高危/创新变异.
|
|
5
|
+
*/
|
|
6
|
+
/** rigor 低于此值即视为"高危人格". */
|
|
7
|
+
export const HIGH_RISK_RIGOR_FLOOR = 0.5;
|
|
8
|
+
/** risk_tolerance 高于此值即视为"高危人格". */
|
|
9
|
+
export const HIGH_RISK_TOLERANCE_CEIL = 0.6;
|
|
10
|
+
/** 放行 high-risk 变异要求的 rigor 下限. */
|
|
11
|
+
export const ALLOW_HIGH_RISK_RIGOR_MIN = 0.6;
|
|
12
|
+
/** 放行 high-risk 变异要求的 risk_tolerance 上限. */
|
|
13
|
+
export const ALLOW_HIGH_RISK_TOLERANCE_MAX = 0.5;
|
|
14
|
+
/**
|
|
15
|
+
* 保守定义: rigor 过低 或 risk_tolerance 过高 → 高危人格.
|
|
16
|
+
* 缺省(无人格)返回 false — 无信息不主动扣帽子, 交由下游默认策略.
|
|
17
|
+
*/
|
|
18
|
+
export function isHighRiskPersonality(p) {
|
|
19
|
+
if (!p)
|
|
20
|
+
return false;
|
|
21
|
+
const s = normalizePersonalityState(p);
|
|
22
|
+
if (s.rigor < HIGH_RISK_RIGOR_FLOOR)
|
|
23
|
+
return true;
|
|
24
|
+
if (s.risk_tolerance > HIGH_RISK_TOLERANCE_CEIL)
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* high-risk 变异只在 rigor≥0.6 且 risk_tolerance≤0.5 放行 (任务用途②的硬阈值).
|
|
30
|
+
* 缺省(无人格)时按最保守假设处理: rigor=0, risk_tolerance=1 → 不放行.
|
|
31
|
+
*/
|
|
32
|
+
export function isHighRiskMutationAllowed(p) {
|
|
33
|
+
const s = p ? normalizePersonalityState(p) : { rigor: 0, risk_tolerance: 1 };
|
|
34
|
+
return s.rigor >= ALLOW_HIGH_RISK_RIGOR_MIN && s.risk_tolerance <= ALLOW_HIGH_RISK_TOLERANCE_MAX;
|
|
35
|
+
}
|
|
36
|
+
/** 安全信号: 追加到 Mutation.trigger_signals, 使降级在事件流里可审计. */
|
|
37
|
+
export const SAFETY_SIGNAL_AVOID_INNOVATE = 'safety:avoid_innovate_with_high_risk_personality';
|
|
38
|
+
export const SAFETY_SIGNAL_DOWNGRADE_HIGH_RISK = 'safety:downgrade_high_risk';
|
|
39
|
+
function uniq(arr) {
|
|
40
|
+
return [...new Set(arr)];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 对一条待执行的变异施加人格风险闸 (v1 buildMutation 内两条硬安全约束的端口):
|
|
44
|
+
* 1. innovate + 高危人格 → 降级为 optimize/low (禁"高危人格 + 创新"组合)
|
|
45
|
+
* 2. high-risk 且人格不满足放行阈值 → 降一档到 medium
|
|
46
|
+
* 纯函数, 返回新 Mutation. cycleEngine 在 buildMutation 后调用它, 再 ingest mutation.built.
|
|
47
|
+
*/
|
|
48
|
+
export function gatePersonalityRisk(mutation, personality) {
|
|
49
|
+
const signals = [];
|
|
50
|
+
let category = mutation.category;
|
|
51
|
+
let risk = mutation.risk_level;
|
|
52
|
+
let expected = mutation.expected_effect;
|
|
53
|
+
// 约束①: 高危人格下禁止 innovate — 降级为 optimize/low.
|
|
54
|
+
if (category === 'innovate' && isHighRiskPersonality(personality)) {
|
|
55
|
+
category = 'optimize';
|
|
56
|
+
risk = 'low';
|
|
57
|
+
expected = 'safety downgrade: optimize under high-risk personality (avoid innovate+high-risk combo)';
|
|
58
|
+
signals.push(SAFETY_SIGNAL_AVOID_INNOVATE);
|
|
59
|
+
}
|
|
60
|
+
// 约束②: high-risk 变异要满足放行阈值, 否则降到 medium.
|
|
61
|
+
if (risk === 'high' && !isHighRiskMutationAllowed(personality)) {
|
|
62
|
+
risk = 'medium';
|
|
63
|
+
signals.push(SAFETY_SIGNAL_DOWNGRADE_HIGH_RISK);
|
|
64
|
+
}
|
|
65
|
+
const downgraded = signals.length > 0;
|
|
66
|
+
if (!downgraded) {
|
|
67
|
+
return { mutation, downgraded: false, appliedSignals: [] };
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
mutation: {
|
|
71
|
+
...mutation,
|
|
72
|
+
category,
|
|
73
|
+
risk_level: risk,
|
|
74
|
+
expected_effect: expected,
|
|
75
|
+
trigger_signals: uniq([...mutation.trigger_signals, ...signals]),
|
|
76
|
+
},
|
|
77
|
+
downgraded: true,
|
|
78
|
+
appliedSignals: signals,
|
|
79
|
+
};
|
|
80
|
+
}
|