create-principles-disciple 1.112.2 → 1.112.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/core/dist/runtime-v2/__tests__/architecture-regression.test.js +11 -2
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js +14 -6
- package/core/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +1 -0
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js +5 -0
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js +4 -1
- package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js +3 -2
- package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +47 -0
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js +66 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js +234 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js +23 -1
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts +11 -0
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js +11 -4
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
- package/core/dist/runtime-v2/adapter/output-schema-registry.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/output-schema-registry.js +2 -0
- package/core/dist/runtime-v2/adapter/output-schema-registry.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +7 -2
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +9 -5
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +9 -5
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +4 -2
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js +157 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +29 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js +311 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js +171 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js +11 -2
- package/core/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js +335 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js +515 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js +167 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js +601 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts +7 -0
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-runner.js +18 -2
- package/core/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +49 -0
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.js +390 -98
- package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.d.ts +127 -0
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.js +345 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-task-guards.d.ts +9 -2
- package/core/dist/runtime-v2/internalization/internalization-task-guards.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-task-guards.js +14 -3
- package/core/dist/runtime-v2/internalization/internalization-task-guards.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.d.ts +61 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.js +84 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.js.map +1 -0
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +17 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts +99 -2
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.js +148 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts +147 -0
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.js +672 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.js +21 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.d.ts +9 -0
- package/core/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.js +22 -0
- package/core/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts +2 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js +130 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js.map +1 -0
- package/core/dist/runtime-v2/signal-collector/index.d.ts +1 -1
- package/core/dist/runtime-v2/signal-collector/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/index.js +1 -1
- package/core/dist/runtime-v2/signal-collector/index.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/llm-stage.d.ts +15 -0
- package/core/dist/runtime-v2/signal-collector/llm-stage.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/llm-stage.js +28 -0
- package/core/dist/runtime-v2/signal-collector/llm-stage.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/types.d.ts +9 -1
- package/core/dist/runtime-v2/signal-collector/types.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/types.js +13 -1
- package/core/dist/runtime-v2/signal-collector/types.js.map +1 -1
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.d.ts +23 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.js +34 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js +7 -0
- package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.js +22 -0
- package/core/dist/runtime-v2/store/task/memory-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js +20 -0
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/task-store.d.ts +14 -0
- package/core/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/package.json +2 -2
- package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-activation.js +36 -7
- package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js +48 -0
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-retry.d.ts +38 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.js +143 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.js.map +1 -0
- package/pd-cli/dist/index.js +11 -0
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/__tests__/evaluator-runner-deps.test.js +19 -7
- package/pd-cli/dist/services/__tests__/evaluator-runner-deps.test.js.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.js +6 -2
- package/pd-cli/dist/services/rulehost-pipeline-runner.js.map +1 -1
- package/plugin/dist/bundle.js +545 -514
- package/plugin/dist/core/rule-host.d.ts +6 -0
- package/plugin/dist/core/runtime-v2-prompt-activation-reader.d.ts +8 -0
- package/plugin/dist/core/signal-collector-host.d.ts +7 -1
- package/plugin/dist/core/signal-keyword-store.d.ts +41 -0
- package/plugin/dist/service/auto-consumer-governance-wiring.d.ts +34 -0
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C (crash/restart liveness 轮): rollout revision budget persistence fail-closed。
|
|
3
|
+
*
|
|
4
|
+
* 顺序契约 (record-first): routing intent (iteration/cause) 持久化成功是
|
|
5
|
+
* reopen 的前置 — 禁止 "reopen 成功 + budget metadata 丢失 + rollout 正常完成"。
|
|
6
|
+
*
|
|
7
|
+
* 故障注入: 真实 store 上包装 stateManager,令 rollout 任务元数据写入在
|
|
8
|
+
* 第一次携带 rolloutRevisionPayload 时失败;随后恢复并重放 revision flow。
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import * as os from 'node:os';
|
|
14
|
+
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
15
|
+
import { InternalizationOrchestrator } from '../internalization-orchestrator.js';
|
|
16
|
+
import { RolloutReviewerRunner } from '../rollout-reviewer-runner.js';
|
|
17
|
+
import { DefaultRolloutReviewerValidator } from '../rollout-reviewer-output.js';
|
|
18
|
+
import { SqliteConnection } from '../../store/sqlite-connection.js';
|
|
19
|
+
import { SqlitePIArtifactStore } from '../../store/artifact/sqlite-pi-artifact-store.js';
|
|
20
|
+
import { storeEmitter } from '../../store/event-emitter.js';
|
|
21
|
+
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata } from '../pitask-metadata.js';
|
|
22
|
+
let workspaceDir;
|
|
23
|
+
let stateManager;
|
|
24
|
+
let orchestrator;
|
|
25
|
+
const SCRIBE_ID = 'scribe-c-prompt';
|
|
26
|
+
const ARTIFICER_ID = 'artificer-c-prompt';
|
|
27
|
+
const EVAL_ID = 'evaluator-c-prompt';
|
|
28
|
+
const ROLLOUT_ID = 'rollout_reviewer-c-prompt';
|
|
29
|
+
const SCRIBE_ART = 'pi-art-scribe-c';
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-clv-'));
|
|
32
|
+
stateManager = new RuntimeStateManager({ workspaceDir });
|
|
33
|
+
await stateManager.initialize();
|
|
34
|
+
orchestrator = new InternalizationOrchestrator({ stateManager }, { owner: 'clv', runtimeKind: 'test-double', dryRun: true });
|
|
35
|
+
});
|
|
36
|
+
afterEach(async () => {
|
|
37
|
+
await stateManager.close();
|
|
38
|
+
try {
|
|
39
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
catch { /* temp */ }
|
|
42
|
+
});
|
|
43
|
+
function meta(o = {}) {
|
|
44
|
+
return createPITaskDiagnosticJson({
|
|
45
|
+
dependencyTaskIds: [], channel: 'prompt', timeoutMs: 300_000,
|
|
46
|
+
inputArtifactRefs: [], outputArtifactRefs: [], ...o,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function mkTask(id, kind, deps) {
|
|
50
|
+
await stateManager.createTask({ taskId: id, taskKind: kind, status: 'pending', attemptCount: 0, maxAttempts: 3, diagnosticJson: meta({ correlationId: 'c', dependencyTaskIds: deps }) });
|
|
51
|
+
}
|
|
52
|
+
async function succeed(id) {
|
|
53
|
+
await stateManager.acquireLease({ taskId: id, owner: 'clv', runtimeKind: 'test-double' });
|
|
54
|
+
await stateManager.markTaskSucceeded(id);
|
|
55
|
+
}
|
|
56
|
+
function makeOutput(decision) {
|
|
57
|
+
return {
|
|
58
|
+
taskId: ROLLOUT_ID, sourceEvaluatorArtifactId: 'pi-art-eval-c',
|
|
59
|
+
review: { decision, summary: 'c', confidence: 0.9, requiredChanges: decision === 'needs_revision' ? ['必须改 X'] : [], rolloutRisks: [], safetyChecks: [] },
|
|
60
|
+
sourceTrace: { evaluatorArtifactId: 'pi-art-eval-c' }, risks: [], generatedAt: new Date().toISOString(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function scriptedAdapter(output) {
|
|
64
|
+
return {
|
|
65
|
+
startRun: async () => ({ runId: 'run-c', runtimeKind: 'test-double', startedAt: new Date().toISOString() }),
|
|
66
|
+
pollRun: async () => ({ status: 'succeeded', runId: 'run-c' }),
|
|
67
|
+
fetchOutput: async () => ({ runId: 'run-c', payload: output }),
|
|
68
|
+
cancelRun: async () => undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** 包装 stateManager: 对 ROLLOUT_ID 的 rolloutRevisionPayload 元数据写入前 failN 次失败 */
|
|
72
|
+
function wrapRoutingWriteFailure(failures) {
|
|
73
|
+
const inner = stateManager;
|
|
74
|
+
const orig = inner.updateTaskDiagnosticJson;
|
|
75
|
+
inner.updateTaskDiagnosticJson = async (taskId, json) => {
|
|
76
|
+
if (taskId === ROLLOUT_ID && json.includes('"rolloutRevisionPayload"') && failures.count > 0) {
|
|
77
|
+
failures.count -= 1;
|
|
78
|
+
throw new Error('injected routing metadata write failure (disk)');
|
|
79
|
+
}
|
|
80
|
+
return orig.call(stateManager, taskId, json);
|
|
81
|
+
};
|
|
82
|
+
return stateManager;
|
|
83
|
+
}
|
|
84
|
+
async function resetRolloutForRerun() {
|
|
85
|
+
// 生产语义的"新一轮" = reopenTaskForRevision: 清 runnerDecision +
|
|
86
|
+
// completionIntent (epoch 前进)。fixture 必须镜像同一清理,否则残留的
|
|
87
|
+
// applied completionIntent 会触发补 terminal 分支而非新一轮评估。
|
|
88
|
+
const t = await stateManager.getTask(ROLLOUT_ID);
|
|
89
|
+
const pi = hydratePITaskRecord(t);
|
|
90
|
+
if (pi) {
|
|
91
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, { runnerDecision: undefined, completionIntent: undefined })));
|
|
92
|
+
}
|
|
93
|
+
await stateManager.updateTask(ROLLOUT_ID, { status: 'pending', attemptCount: 0 });
|
|
94
|
+
}
|
|
95
|
+
function makeRunner(injected) {
|
|
96
|
+
return new RolloutReviewerRunner({
|
|
97
|
+
stateManager: injected, runtimeAdapter: scriptedAdapter(makeOutput('needs_revision')),
|
|
98
|
+
eventEmitter: storeEmitter, validator: new DefaultRolloutReviewerValidator(),
|
|
99
|
+
artifactStore: new SqlitePIArtifactStore(new SqliteConnection(workspaceDir)),
|
|
100
|
+
reopenRevisionTarget: async (input) => {
|
|
101
|
+
const r = await orchestrator.reopenTaskForRevision(input.targetTaskId, {
|
|
102
|
+
revisionFeedback: input.revisionFeedback,
|
|
103
|
+
revisionCauseId: `rollout-${input.sourceRolloutTaskId}-r${input.revisionIteration}`,
|
|
104
|
+
});
|
|
105
|
+
return r.ok ? { ok: true, reason: r.reason, reopenedTaskId: input.targetTaskId } : { ok: false, reason: r.reason };
|
|
106
|
+
},
|
|
107
|
+
}, { owner: 'clv', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 5_000 });
|
|
108
|
+
}
|
|
109
|
+
async function readRolloutRouting() {
|
|
110
|
+
const t = await stateManager.getTask(ROLLOUT_ID);
|
|
111
|
+
const pi = hydratePITaskRecord(t);
|
|
112
|
+
return {
|
|
113
|
+
iteration: pi?.rolloutRevisionPayload?.revisionIteration,
|
|
114
|
+
causeId: pi?.revisionCauseId,
|
|
115
|
+
runnerDecision: pi?.runnerDecision,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
describe('C — rollout revision budget persistence fail-closed (record-first)', () => {
|
|
119
|
+
it('routing 元数据写失败 → 不 reopen + 任务不 succeeded;恢复后重放恰一次;iteration 不回退;2-round bound 保持', async () => {
|
|
120
|
+
// lineage: scribe(validated bearer) → artificer → evaluator(succeeded+approved) → rollout
|
|
121
|
+
await mkTask(SCRIBE_ID, 'scribe', []);
|
|
122
|
+
await succeed(SCRIBE_ID);
|
|
123
|
+
await mkTask(ARTIFICER_ID, 'artificer', [SCRIBE_ID]);
|
|
124
|
+
await succeed(ARTIFICER_ID);
|
|
125
|
+
await mkTask(EVAL_ID, 'evaluator', [ARTIFICER_ID]);
|
|
126
|
+
await succeed(EVAL_ID);
|
|
127
|
+
const evalRaw = await stateManager.getTask(EVAL_ID);
|
|
128
|
+
if (!evalRaw)
|
|
129
|
+
throw new Error('seed: evaluator missing');
|
|
130
|
+
const evalPi = hydratePITaskRecord(evalRaw);
|
|
131
|
+
if (!evalPi)
|
|
132
|
+
throw new Error('seed: evaluator not hydratable');
|
|
133
|
+
await stateManager.updateTaskDiagnosticJson(EVAL_ID, createPITaskDiagnosticJson(mergePITaskMetadata(evalPi, { runnerDecision: 'approved' })));
|
|
134
|
+
await mkTask(ROLLOUT_ID, 'rollout_reviewer', [EVAL_ID]);
|
|
135
|
+
const conn = new SqliteConnection(workspaceDir);
|
|
136
|
+
const store = new SqlitePIArtifactStore(conn);
|
|
137
|
+
await store.upsertArtifact({
|
|
138
|
+
artifactId: 'pi-art-eval-c', artifactKind: 'principle', sourceTaskId: EVAL_ID,
|
|
139
|
+
lineageArtifactIds: [], validationStatus: 'pending',
|
|
140
|
+
contentJson: JSON.stringify({ evaluation: { decision: 'approved', score: 0.9, strengths: [], concerns: [], requiredChanges: [] } }),
|
|
141
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
await store.upsertArtifact({
|
|
144
|
+
artifactId: SCRIBE_ART, artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
145
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
146
|
+
contentJson: JSON.stringify({ principleId: 'c-p', text: '原则', principleDraft: { title: 'c-p', statement: '原则' } }),
|
|
147
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
148
|
+
});
|
|
149
|
+
conn.close();
|
|
150
|
+
// ── 1) 注入: 第一次 routing 元数据写失败 ──
|
|
151
|
+
const failures = { count: 1 };
|
|
152
|
+
const injected = wrapRoutingWriteFailure(failures);
|
|
153
|
+
const r1 = await makeRunner(injected).run(ROLLOUT_ID);
|
|
154
|
+
// fail-closed: 任务未 succeeded (retry 路径),scribe 未被 reopen
|
|
155
|
+
expect(r1.status).not.toBe('succeeded');
|
|
156
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded');
|
|
157
|
+
expect((await readRolloutRouting()).iteration).toBeUndefined(); // budget 未落
|
|
158
|
+
// ── 2) 恢复 + 重放 (模拟重启后的 revision flow) ──
|
|
159
|
+
// run1 的 payload 写失败已把任务置 retry_wait (intent 已 pending durable)
|
|
160
|
+
// — 直接重跑即触发入口门 resume (无 LLM 重问),无需手工 reset。
|
|
161
|
+
const r1Task = await stateManager.getTask(ROLLOUT_ID);
|
|
162
|
+
if (r1Task?.status !== 'retry_wait')
|
|
163
|
+
throw new Error(`C: expected retry_wait after failure, got ${r1Task?.status}`);
|
|
164
|
+
const r2 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
165
|
+
expect(r2.status).toBe('succeeded');
|
|
166
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('pending'); // reopen 恰发生一次
|
|
167
|
+
const after1 = await readRolloutRouting();
|
|
168
|
+
expect(after1.iteration).toBe(1); // 不回退、不重复
|
|
169
|
+
// ── 3) 第二轮 revision (target 完成后再次 needs_revision) ──
|
|
170
|
+
await succeed(SCRIBE_ID); // target 修订完成
|
|
171
|
+
await resetRolloutForRerun();
|
|
172
|
+
const r3 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
173
|
+
expect(r3.status).toBe('succeeded');
|
|
174
|
+
const after2 = await readRolloutRouting();
|
|
175
|
+
expect(after2.iteration).toBe(2); // 递进, 未重置
|
|
176
|
+
// ── 4) 第三轮 → budget exhausted → needs_human_review (2-round bound) ──
|
|
177
|
+
await succeed(SCRIBE_ID);
|
|
178
|
+
await resetRolloutForRerun();
|
|
179
|
+
const r4 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
180
|
+
expect(r4.status).toBe('succeeded'); // runner 完成
|
|
181
|
+
expect((await stateManager.getTask(ROLLOUT_ID))?.status).toBe('needs_human_review');
|
|
182
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded'); // 未产生额外 revision
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('B — revision intent materialization state machine', () => {
|
|
186
|
+
// 复用 C describe 的 lineage 构造: 提取为 helper
|
|
187
|
+
async function seedLineage() {
|
|
188
|
+
await mkTask(SCRIBE_ID, 'scribe', []);
|
|
189
|
+
await succeed(SCRIBE_ID);
|
|
190
|
+
await mkTask(ARTIFICER_ID, 'artificer', [SCRIBE_ID]);
|
|
191
|
+
await succeed(ARTIFICER_ID);
|
|
192
|
+
await mkTask(EVAL_ID, 'evaluator', [ARTIFICER_ID]);
|
|
193
|
+
await succeed(EVAL_ID);
|
|
194
|
+
const evalRaw = await stateManager.getTask(EVAL_ID);
|
|
195
|
+
if (!evalRaw)
|
|
196
|
+
throw new Error('seed: evaluator missing');
|
|
197
|
+
const evalPi = hydratePITaskRecord(evalRaw);
|
|
198
|
+
if (!evalPi)
|
|
199
|
+
throw new Error('seed: evaluator not hydratable');
|
|
200
|
+
await stateManager.updateTaskDiagnosticJson(EVAL_ID, createPITaskDiagnosticJson(mergePITaskMetadata(evalPi, { runnerDecision: 'approved' })));
|
|
201
|
+
await mkTask(ROLLOUT_ID, 'rollout_reviewer', [EVAL_ID]);
|
|
202
|
+
const conn = new SqliteConnection(workspaceDir);
|
|
203
|
+
const store = new SqlitePIArtifactStore(conn);
|
|
204
|
+
await store.upsertArtifact({
|
|
205
|
+
artifactId: 'pi-art-eval-c', artifactKind: 'principle', sourceTaskId: EVAL_ID,
|
|
206
|
+
lineageArtifactIds: [], validationStatus: 'pending',
|
|
207
|
+
contentJson: JSON.stringify({ evaluation: { decision: 'approved', score: 0.9, strengths: [], concerns: [], requiredChanges: [] } }),
|
|
208
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
209
|
+
});
|
|
210
|
+
await store.upsertArtifact({
|
|
211
|
+
artifactId: SCRIBE_ART, artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
212
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
213
|
+
contentJson: JSON.stringify({ principleId: 'c-p', text: '原则', principleDraft: { title: 'c-p', statement: '原则' } }),
|
|
214
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
215
|
+
});
|
|
216
|
+
conn.close();
|
|
217
|
+
}
|
|
218
|
+
function runnerWithInjectedWriteFailure(failures) {
|
|
219
|
+
return makeRunner(wrapRoutingWriteFailure(failures));
|
|
220
|
+
}
|
|
221
|
+
async function readIntent() {
|
|
222
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(ROLLOUT_ID));
|
|
223
|
+
return { iteration: pi?.rolloutRevisionPayload?.revisionIteration, status: pi?.rolloutRevisionPayload?.status };
|
|
224
|
+
}
|
|
225
|
+
async function scribeRc() {
|
|
226
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(SCRIBE_ID));
|
|
227
|
+
return pi?.revisionCount ?? 0;
|
|
228
|
+
}
|
|
229
|
+
it('B1: persist intent r1 → crash before reopen → restart 继续执行 r1 (不自动 r2),budget 只耗 1', async () => {
|
|
230
|
+
await seedLineage();
|
|
231
|
+
// 手工构造 crash 态: 只完成 intent 持久化 (status pending, r1), 不 reopen
|
|
232
|
+
const raw = await stateManager.getTask(ROLLOUT_ID);
|
|
233
|
+
if (!raw)
|
|
234
|
+
throw new Error('B1: rollout task missing');
|
|
235
|
+
const pi = hydratePITaskRecord(raw);
|
|
236
|
+
if (!pi)
|
|
237
|
+
throw new Error('B1: rollout task not hydratable');
|
|
238
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, {
|
|
239
|
+
rolloutRevisionPayload: {
|
|
240
|
+
requiredChanges: ['x'], revisionIteration: 1, sourceRolloutTaskId: ROLLOUT_ID,
|
|
241
|
+
sourceArtifactId: SCRIBE_ART, targetTaskKind: 'scribe', status: 'pending',
|
|
242
|
+
},
|
|
243
|
+
})));
|
|
244
|
+
// restart 后 revision flow 重放 (rollout runner 正常跑 needs_revision)
|
|
245
|
+
const r = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
246
|
+
expect(r.status).toBe('succeeded');
|
|
247
|
+
const intent = await readIntent();
|
|
248
|
+
expect(intent.iteration).toBe(1); // 继续 r1, 未跳 r2
|
|
249
|
+
expect(intent.status).toBe('applied');
|
|
250
|
+
expect(await scribeRc()).toBe(1); // target revisionCount 只 +1
|
|
251
|
+
});
|
|
252
|
+
it('B2: persist r1 + reopen r1 → crash before rollout succeeded → restart 识别已 materialize,不 reopen r2,revisionCount 不变', async () => {
|
|
253
|
+
await seedLineage();
|
|
254
|
+
// 正常跑完第一轮 (含 reopen + applied + succeeded)
|
|
255
|
+
const r1 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
256
|
+
expect(r1.status).toBe('succeeded');
|
|
257
|
+
expect(await scribeRc()).toBe(1);
|
|
258
|
+
const rcAfterRound1 = await scribeRc();
|
|
259
|
+
// 构造 B2 crash 态 (现代协议): "reopen 已 materialize 但 rollout 未标
|
|
260
|
+
// succeeded 前崩溃" = completionIntent 回 pending (保留 target 的
|
|
261
|
+
// causeId=r1);payload 回 pending 模拟 markRevisionIntentApplied 前窗口。
|
|
262
|
+
const runs = await stateManager.getRunsByTask(ROLLOUT_ID);
|
|
263
|
+
const sourceRunId = runs[runs.length - 1]?.runId;
|
|
264
|
+
if (!sourceRunId)
|
|
265
|
+
throw new Error('B2: no durable run for intent sourceRunId');
|
|
266
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(ROLLOUT_ID));
|
|
267
|
+
if (!pi)
|
|
268
|
+
throw new Error('B2: rollout not hydratable');
|
|
269
|
+
const payload = pi.rolloutRevisionPayload;
|
|
270
|
+
if (!payload)
|
|
271
|
+
throw new Error('B2: revision intent payload missing');
|
|
272
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, {
|
|
273
|
+
completionIntent: { decision: 'needs_revision', sourceRunId, revisionEpoch: pi.revisionCount ?? 0, status: 'pending', revisionIteration: 1 },
|
|
274
|
+
rolloutRevisionPayload: { ...payload, status: 'pending' },
|
|
275
|
+
})));
|
|
276
|
+
await stateManager.updateTask(ROLLOUT_ID, { status: 'pending', attemptCount: 0 });
|
|
277
|
+
// restart 后重放: 必须识别 r1 已 materialize (target causeId 匹配)
|
|
278
|
+
const r2 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
279
|
+
expect(r2.status).toBe('succeeded');
|
|
280
|
+
const intent = await readIntent();
|
|
281
|
+
expect(intent.iteration).toBe(1); // 未进到 r2
|
|
282
|
+
expect(intent.status).toBe('applied');
|
|
283
|
+
expect(await scribeRc()).toBe(rcAfterRound1); // 未产生额外 reopen
|
|
284
|
+
});
|
|
285
|
+
it('B3: budget 按 materialized 计数 — r1/r2 applied 后第三个 verdict 才 needs_human_review', async () => {
|
|
286
|
+
await seedLineage();
|
|
287
|
+
// r1
|
|
288
|
+
expect((await makeRunner(stateManager).run(ROLLOUT_ID)).status).toBe('succeeded');
|
|
289
|
+
await succeed(SCRIBE_ID);
|
|
290
|
+
await resetRolloutForRerun();
|
|
291
|
+
// r2
|
|
292
|
+
expect((await makeRunner(stateManager).run(ROLLOUT_ID)).status).toBe('succeeded');
|
|
293
|
+
expect((await readIntent()).iteration).toBe(2);
|
|
294
|
+
await succeed(SCRIBE_ID);
|
|
295
|
+
await resetRolloutForRerun();
|
|
296
|
+
// 第三个 verdict → exhausted (applied=2)
|
|
297
|
+
const r3 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
298
|
+
expect(r3.status).toBe('succeeded');
|
|
299
|
+
expect((await stateManager.getTask(ROLLOUT_ID))?.status).toBe('needs_human_review');
|
|
300
|
+
expect(await scribeRc()).toBe(2); // 恰两次 materialized reopen
|
|
301
|
+
});
|
|
302
|
+
it('B4: intent 写失败 → 无 reopen,任务重试,budget/intent 不变', async () => {
|
|
303
|
+
await seedLineage();
|
|
304
|
+
const before = await readIntent();
|
|
305
|
+
const r = await runnerWithInjectedWriteFailure({ count: 1 }).run(ROLLOUT_ID);
|
|
306
|
+
expect(r.status).not.toBe('succeeded');
|
|
307
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded'); // 未 reopen
|
|
308
|
+
expect(await readIntent()).toEqual(before); // budget 未写
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=crash-liveness-regressions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-liveness-regressions.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.ts"],"names":[],"mappings":"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"}
|
package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-review-p0-regressions.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 外部复核 P0 回归测试 (P0-3 / P0-4 / P1-1)。
|
|
3
|
+
*
|
|
4
|
+
* P0-4 fault injection: repair seed 成功后模拟 evaluator completion crash,
|
|
5
|
+
* 重放同一 commit — 断言 repair task 唯一 (确定性 id) 且 reopen 真幂等
|
|
6
|
+
* (revisionCount 不递增)。
|
|
7
|
+
* P0-3 orchestrator 传导: durable verdict 缺失时 runs.output_payload 的
|
|
8
|
+
* 显式 verdict 是唯一 legacy 判据。
|
|
9
|
+
* P1-1: artificer prompt 真实携带 rollout revisionFeedback。
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
16
|
+
import { InternalizationOrchestrator } from '../internalization-orchestrator.js';
|
|
17
|
+
import { ArtificerRunner } from '../artificer-runner.js';
|
|
18
|
+
import { DefaultArtificerValidator } from '../artificer-output.js';
|
|
19
|
+
import { MemoryPIArtifactStore } from '../pi-artifact-store.js';
|
|
20
|
+
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata } from '../pitask-metadata.js';
|
|
21
|
+
import { storeEmitter } from '../../store/event-emitter.js';
|
|
22
|
+
let workspaceDir;
|
|
23
|
+
let stateManager;
|
|
24
|
+
let orchestrator;
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-p0reg-'));
|
|
27
|
+
stateManager = new RuntimeStateManager({ workspaceDir });
|
|
28
|
+
await stateManager.initialize();
|
|
29
|
+
orchestrator = new InternalizationOrchestrator({ stateManager }, { owner: 'p0reg', runtimeKind: 'test-double', dryRun: true });
|
|
30
|
+
});
|
|
31
|
+
afterEach(async () => {
|
|
32
|
+
await stateManager.close();
|
|
33
|
+
try {
|
|
34
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
35
|
+
}
|
|
36
|
+
catch { /* temp */ }
|
|
37
|
+
});
|
|
38
|
+
function meta(o = {}) {
|
|
39
|
+
return createPITaskDiagnosticJson({
|
|
40
|
+
dependencyTaskIds: [], channel: 'prompt', timeoutMs: 300_000,
|
|
41
|
+
inputArtifactRefs: [], outputArtifactRefs: [], ...o,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function mkTask(taskId, taskKind, diagnosticJson, status = 'pending') {
|
|
45
|
+
await stateManager.createTask({
|
|
46
|
+
taskId, taskKind, status: status, attemptCount: 0, maxAttempts: 3, diagnosticJson,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function succeed(taskId, runnerDecision) {
|
|
50
|
+
await stateManager.acquireLease({ taskId, owner: 'p0reg', runtimeKind: 'test-double' });
|
|
51
|
+
await stateManager.markTaskSucceeded(taskId);
|
|
52
|
+
if (runnerDecision) {
|
|
53
|
+
const t = await stateManager.getTask(taskId);
|
|
54
|
+
const pi = hydratePITaskRecord(t);
|
|
55
|
+
if (pi) {
|
|
56
|
+
await stateManager.updateTaskDiagnosticJson(taskId, createPITaskDiagnosticJson(mergePITaskMetadata(pi, { runnerDecision: runnerDecision })));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ── P0-4: deterministic repair identity + idempotent reopen ──────────────────
|
|
61
|
+
describe('P0-4 — repair/reopen 真幂等 (fault injection)', () => {
|
|
62
|
+
it('repair 完成后 evaluator completion crash → 重放 commit: repair task 唯一,revisionCount 不递增', async () => {
|
|
63
|
+
const EVAL_ID = 'evaluator-p04-prompt';
|
|
64
|
+
const SCRIBE_ID = 'scribe-p04-prompt';
|
|
65
|
+
const REPAIR_ID = 'artificer-repair-evaluator-p04-prompt-r1'; // 确定性 id
|
|
66
|
+
await mkTask(SCRIBE_ID, 'scribe', meta({ correlationId: 'p04' }));
|
|
67
|
+
await succeed(SCRIBE_ID);
|
|
68
|
+
await mkTask('artificer-p04-prompt', 'artificer', meta({ dependencyTaskIds: [SCRIBE_ID], correlationId: 'p04' }));
|
|
69
|
+
await succeed('artificer-p04-prompt');
|
|
70
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ dependencyTaskIds: ['artificer-p04-prompt'], correlationId: 'p04' }));
|
|
71
|
+
await succeed(EVAL_ID, 'needs_revision');
|
|
72
|
+
// evaluator runner 已 seed repair (生产由 seeder 创建; 此处按生产确定性 id)
|
|
73
|
+
await mkTask(REPAIR_ID, 'artificer', meta({
|
|
74
|
+
dependencyTaskIds: [SCRIBE_ID], correlationId: 'p04',
|
|
75
|
+
repairPayload: { requiredChanges: ['x'], concerns: [], previousScore: 0.4, repairIteration: 1, sourceArtificerArtifactId: 'pi-art-a', sourceEvaluatorTaskId: EVAL_ID },
|
|
76
|
+
}));
|
|
77
|
+
// repair 完成 → commit → evaluator reopen (第一次)
|
|
78
|
+
await succeed(REPAIR_ID);
|
|
79
|
+
const r1 = await orchestrator.commitNextTaskProposal(REPAIR_ID);
|
|
80
|
+
expect(r1.decision).toBe('revision_reopened');
|
|
81
|
+
let evalTask = await stateManager.getTask(EVAL_ID);
|
|
82
|
+
let evalPi = hydratePITaskRecord(evalTask);
|
|
83
|
+
expect(evalPi?.revisionCount).toBe(1);
|
|
84
|
+
// ── fault injection: 模拟 evaluator 修订轮完成过程中 crash ──
|
|
85
|
+
// (不推进 evaluator; consumer 下一周期重放同一 repair commit)
|
|
86
|
+
const r2 = await orchestrator.commitNextTaskProposal(REPAIR_ID);
|
|
87
|
+
// crash-liveness 轮: 同 cause 重放 = 真 no-op (不再是 revision_reopened)
|
|
88
|
+
expect(r2.decision).toBe('revision_reopen_noop');
|
|
89
|
+
// 关键断言: revisionCount 不递增 (同 causeId 重放 = no-op 语义)
|
|
90
|
+
evalTask = await stateManager.getTask(EVAL_ID);
|
|
91
|
+
evalPi = hydratePITaskRecord(evalTask);
|
|
92
|
+
expect(evalPi?.revisionCount).toBe(1);
|
|
93
|
+
// repair task 唯一: 重放没有创建第二个 repair 任务
|
|
94
|
+
const tasks = await stateManager.listTasks({});
|
|
95
|
+
const repairTasks = tasks.filter((t) => t.taskKind === 'artificer' && t.taskId.startsWith('artificer-repair-'));
|
|
96
|
+
expect(repairTasks.length).toBe(1);
|
|
97
|
+
expect(repairTasks[0]?.taskId).toBe(REPAIR_ID);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── P0-3: orchestrator legacy verdict 传导 ───────────────────────────────────
|
|
101
|
+
describe('P0-3 — durable verdict 缺失时的显式 legacy 解析', () => {
|
|
102
|
+
it('runs.output_payload 携带 needs_revision → blocked_by_revision (不 ADVANCE,不 BLOCKED)', async () => {
|
|
103
|
+
const EVAL_ID = 'evaluator-p03-prompt';
|
|
104
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ correlationId: 'p03' }));
|
|
105
|
+
await succeed(EVAL_ID); // 无 runnerDecision (历史数据形状)
|
|
106
|
+
// 历史 verdict 载体: 最近 succeeded run 的 output_payload
|
|
107
|
+
const runs = await stateManager.getRunsByTask(EVAL_ID);
|
|
108
|
+
expect(runs.length).toBeGreaterThan(0);
|
|
109
|
+
const runId = runs[runs.length - 1]?.runId ?? '';
|
|
110
|
+
await stateManager.updateRunOutput(runId, JSON.stringify({
|
|
111
|
+
evaluation: { decision: 'needs_revision', summary: 'x', score: 0.4, strengths: [], concerns: [], requiredChanges: ['y'] },
|
|
112
|
+
}));
|
|
113
|
+
const r = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
114
|
+
expect(r.decision).toBe('blocked_by_revision');
|
|
115
|
+
});
|
|
116
|
+
it('无 durable 且 runs 无可解析 verdict → blocked_missing_verdict (fail-closed)', async () => {
|
|
117
|
+
const EVAL_ID = 'evaluator-p03b-prompt';
|
|
118
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ correlationId: 'p03b' }));
|
|
119
|
+
await succeed(EVAL_ID);
|
|
120
|
+
// runs 存在但 output_payload 为空/非 JSON
|
|
121
|
+
const runs = await stateManager.getRunsByTask(EVAL_ID);
|
|
122
|
+
const runId = runs[runs.length - 1]?.runId ?? '';
|
|
123
|
+
const r1 = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
124
|
+
expect(r1.decision).toBe('blocked_missing_verdict');
|
|
125
|
+
await stateManager.updateRunOutput(runId, 'not-json');
|
|
126
|
+
const r2 = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
127
|
+
expect(r2.decision).toBe('blocked_missing_verdict');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
// ── P1-1: artificer prompt 携带 rollout revisionFeedback ─────────────────────
|
|
131
|
+
describe('P1-1 — artificer 真实消费 rollout requiredChanges', () => {
|
|
132
|
+
it('revisionFeedback 存在时,发给 RuntimeAdapter 的 prompt 包含 requiredChanges 文本', async () => {
|
|
133
|
+
const SCRIBE_ID = 'scribe-p11-prompt';
|
|
134
|
+
const ARTIFICER_ID = 'artificer-p11-prompt';
|
|
135
|
+
await mkTask(SCRIBE_ID, 'scribe', meta({ correlationId: 'p11' }));
|
|
136
|
+
await succeed(SCRIBE_ID);
|
|
137
|
+
const artifactStore = new MemoryPIArtifactStore();
|
|
138
|
+
await artifactStore.upsertArtifact({
|
|
139
|
+
artifactId: 'pi-art-scribe-p11', artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
140
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
141
|
+
contentJson: JSON.stringify({ principleId: 'p11', text: '原则', principleDraft: { title: 'p11', statement: '原则' } }),
|
|
142
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
143
|
+
});
|
|
144
|
+
// artificer 任务带 rollout revisionFeedback (reopen 注入)
|
|
145
|
+
await mkTask(ARTIFICER_ID, 'artificer', meta({
|
|
146
|
+
dependencyTaskIds: [SCRIBE_ID], correlationId: 'p11',
|
|
147
|
+
revisionFeedback: 'Rollout review 判定 needs_revision,请修订后重新走验证链:\n- 必须修改: 规则必须覆盖子目录场景\n- 风险: 未覆盖 nested path',
|
|
148
|
+
}));
|
|
149
|
+
const capturedPrompts = [];
|
|
150
|
+
const adapter = {
|
|
151
|
+
startRun: async (input) => {
|
|
152
|
+
capturedPrompts.push(String(input.inputPayload));
|
|
153
|
+
return { runId: 'run-p11', runtimeKind: 'test-double', startedAt: new Date().toISOString() };
|
|
154
|
+
},
|
|
155
|
+
pollRun: async () => ({ status: 'succeeded', runId: 'run-p11' }),
|
|
156
|
+
fetchOutput: async () => ({ runId: 'run-p11', payload: null }),
|
|
157
|
+
cancelRun: async () => undefined,
|
|
158
|
+
};
|
|
159
|
+
const runner = new ArtificerRunner({
|
|
160
|
+
stateManager, runtimeAdapter: adapter, eventEmitter: storeEmitter,
|
|
161
|
+
artifactStore, validator: new DefaultArtificerValidator(), contentHashFn: undefined,
|
|
162
|
+
}, { owner: 'p11', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 5_000 });
|
|
163
|
+
// fetchOutput 返回 null → runner 走失败路径;但 prompt 已捕获 — 断言 prompt 内容
|
|
164
|
+
await runner.run(ARTIFICER_ID).catch(() => undefined);
|
|
165
|
+
expect(capturedPrompts.length).toBeGreaterThan(0);
|
|
166
|
+
const prompt = capturedPrompts.join('\n');
|
|
167
|
+
expect(prompt).toContain('规则必须覆盖子目录场景'); // requiredChange 原文
|
|
168
|
+
expect(prompt).toContain('rollout_revision_feedback'); // 注入信封标记
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=external-review-p0-regressions.test.js.map
|
package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-review-p0-regressions.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -175,12 +175,21 @@ describe('Internalization Task Guards (PRI-62)', () => {
|
|
|
175
175
|
it('disallows retry_wait -> retry_wait (self-transition)', () => {
|
|
176
176
|
expect(canTransitionTo('retry_wait', 'retry_wait')).toBe(false);
|
|
177
177
|
});
|
|
178
|
-
it('
|
|
179
|
-
|
|
178
|
+
it('allows succeeded -> pending ONLY for revision reopen (P0-D, INV-02); disallows other successors', () => {
|
|
179
|
+
// 契约变更 (2026-08-18, MVP core-loop closure): succeeded → pending 是
|
|
180
|
+
// revision reopen 的合法出边 (orchestrator.reopenTaskForRevision:
|
|
181
|
+
// evaluator repair 轮、rollout revision 路由、上游修订级联)。
|
|
182
|
+
// 其余 succeeded 出边仍然全部禁止。
|
|
183
|
+
expect(canTransitionTo('succeeded', 'pending')).toBe(true);
|
|
180
184
|
expect(canTransitionTo('succeeded', 'leased')).toBe(false);
|
|
181
185
|
expect(canTransitionTo('succeeded', 'failed')).toBe(false);
|
|
182
186
|
expect(canTransitionTo('succeeded', 'retry_wait')).toBe(false);
|
|
183
187
|
});
|
|
188
|
+
it('allows needs_human_review -> pending (owner retry out-edge, INV-03); disallows others', () => {
|
|
189
|
+
expect(canTransitionTo('needs_human_review', 'pending')).toBe(true);
|
|
190
|
+
expect(canTransitionTo('needs_human_review', 'leased')).toBe(false);
|
|
191
|
+
expect(canTransitionTo('needs_human_review', 'failed')).toBe(false);
|
|
192
|
+
});
|
|
184
193
|
it('disallows failed -> any state', () => {
|
|
185
194
|
expect(canTransitionTo('failed', 'pending')).toBe(false);
|
|
186
195
|
expect(canTransitionTo('failed', 'leased')).toBe(false);
|