@principles/core 1.258.0 → 1.259.1
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/runtime-v2/__tests__/architecture-regression.test.js +15 -2
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js +14 -6
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +1 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js +5 -0
- package/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/internalization-orchestrator.test.js +4 -1
- package/dist/runtime-v2/__tests__/internalization-orchestrator.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/internalization-state-machine.test.js +3 -2
- package/dist/runtime-v2/__tests__/internalization-state-machine.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +47 -0
- package/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js +66 -1
- package/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js +234 -0
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js +23 -1
- package/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js.map +1 -1
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts +11 -0
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts.map +1 -1
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.js +11 -4
- package/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
- package/dist/runtime-v2/adapter/output-schema-registry.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/output-schema-registry.js +2 -0
- package/dist/runtime-v2/adapter/output-schema-registry.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +7 -2
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +10 -6
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/feedback/__tests__/fingerprint.test.d.ts +2 -0
- package/dist/runtime-v2/feedback/__tests__/fingerprint.test.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/fingerprint.test.js +126 -0
- package/dist/runtime-v2/feedback/__tests__/fingerprint.test.js.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/slice1-typed-fields.test.d.ts +2 -0
- package/dist/runtime-v2/feedback/__tests__/slice1-typed-fields.test.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/slice1-typed-fields.test.js +278 -0
- package/dist/runtime-v2/feedback/__tests__/slice1-typed-fields.test.js.map +1 -0
- package/dist/runtime-v2/feedback/create-report.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/create-report.js +38 -1
- package/dist/runtime-v2/feedback/create-report.js.map +1 -1
- package/dist/runtime-v2/feedback/feedback-types.d.ts +60 -0
- package/dist/runtime-v2/feedback/feedback-types.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/feedback-types.js +58 -0
- package/dist/runtime-v2/feedback/feedback-types.js.map +1 -1
- package/dist/runtime-v2/feedback/fingerprint.d.ts +31 -0
- package/dist/runtime-v2/feedback/fingerprint.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/fingerprint.js +51 -0
- package/dist/runtime-v2/feedback/fingerprint.js.map +1 -0
- package/dist/runtime-v2/feedback/index.d.ts +3 -2
- package/dist/runtime-v2/feedback/index.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/index.js +2 -1
- package/dist/runtime-v2/feedback/index.js.map +1 -1
- package/dist/runtime-v2/feedback/privacy-preview.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/privacy-preview.js +43 -0
- package/dist/runtime-v2/feedback/privacy-preview.js.map +1 -1
- package/dist/runtime-v2/feedback/render-markdown.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/render-markdown.js +33 -0
- package/dist/runtime-v2/feedback/render-markdown.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +11 -7
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +5 -3
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js +157 -0
- package/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +29 -0
- package/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js +311 -0
- package/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js +171 -0
- package/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js +11 -2
- package/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js +335 -0
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js +515 -0
- package/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js +167 -0
- package/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js +601 -0
- package/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js.map +1 -0
- package/dist/runtime-v2/internalization/artificer-runner.d.ts +7 -0
- package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.js +18 -2
- package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts +49 -0
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +390 -98
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/internalization-orchestrator.d.ts +127 -0
- package/dist/runtime-v2/internalization/internalization-orchestrator.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/internalization-orchestrator.js +345 -1
- package/dist/runtime-v2/internalization/internalization-orchestrator.js.map +1 -1
- package/dist/runtime-v2/internalization/internalization-task-guards.d.ts +9 -2
- package/dist/runtime-v2/internalization/internalization-task-guards.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/internalization-task-guards.js +14 -3
- package/dist/runtime-v2/internalization/internalization-task-guards.js.map +1 -1
- package/dist/runtime-v2/internalization/internalization-transition-decision.d.ts +61 -0
- package/dist/runtime-v2/internalization/internalization-transition-decision.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/internalization-transition-decision.js +84 -0
- package/dist/runtime-v2/internalization/internalization-transition-decision.js.map +1 -0
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +17 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts +99 -2
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.js +148 -0
- package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts +147 -0
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.js +672 -1
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.d.ts +2 -0
- package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.js +21 -1
- package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts +9 -0
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +22 -0
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts +2 -0
- package/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts.map +1 -0
- package/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js +130 -0
- package/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js.map +1 -0
- package/dist/runtime-v2/signal-collector/index.d.ts +1 -1
- package/dist/runtime-v2/signal-collector/index.d.ts.map +1 -1
- package/dist/runtime-v2/signal-collector/index.js +1 -1
- package/dist/runtime-v2/signal-collector/index.js.map +1 -1
- package/dist/runtime-v2/signal-collector/llm-stage.d.ts +15 -0
- package/dist/runtime-v2/signal-collector/llm-stage.d.ts.map +1 -1
- package/dist/runtime-v2/signal-collector/llm-stage.js +28 -0
- package/dist/runtime-v2/signal-collector/llm-stage.js.map +1 -1
- package/dist/runtime-v2/signal-collector/types.d.ts +9 -1
- package/dist/runtime-v2/signal-collector/types.d.ts.map +1 -1
- package/dist/runtime-v2/signal-collector/types.js +13 -1
- package/dist/runtime-v2/signal-collector/types.js.map +1 -1
- package/dist/runtime-v2/store/reconciliation-cursor-store.d.ts +23 -0
- package/dist/runtime-v2/store/reconciliation-cursor-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/reconciliation-cursor-store.js +34 -0
- package/dist/runtime-v2/store/reconciliation-cursor-store.js.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +7 -0
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/dist/runtime-v2/store/task/memory-task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/memory-task-store.js +22 -0
- package/dist/runtime-v2/store/task/memory-task-store.js.map +1 -1
- package/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/sqlite-task-store.js +20 -0
- package/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/dist/runtime-v2/store/task/task-store.d.ts +14 -0
- package/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Journey 11 — Restart Safety (Worker 隔离 E2E)。
|
|
3
|
+
*
|
|
4
|
+
* 此前 PARTIAL 的原因: 只做了幂等设计级验证。本测试把 J5/J8 场景拆到
|
|
5
|
+
* 多个独立 Worker——每个 Worker 拥有独立模块图/事件循环/DB 连接,退出后
|
|
6
|
+
* 内存状态全部消失;下一 stage 新 Worker 从 SQLite 重读,等价于 OpenClaw
|
|
7
|
+
* 在 REVISING / 修订推进 / WAITING_FOR_DISPATCH 各阶段重启。
|
|
8
|
+
*
|
|
9
|
+
* 断言 (INV-08): 状态不丢、不重复创建任务、不重复 approval、不重复
|
|
10
|
+
* activation、不重复 promotion。
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect } from 'vitest';
|
|
13
|
+
import { Worker } from 'node:worker_threads';
|
|
14
|
+
import * as fs from 'node:fs';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const WORKER_SCRIPT = path.join(here, 'restart-safety-worker.mjs');
|
|
20
|
+
/** stage 白名单: 只接受枚举值(注入防御) */
|
|
21
|
+
const ALLOWED_STAGES = new Set(['seed', 'repair-complete', 'evaluator-approved', 'rollout-approve', 'eval-approved-nocommit', 'rollout-succeed', 'reconcile']);
|
|
22
|
+
function runStage(workspaceDir, stage) {
|
|
23
|
+
if (!ALLOWED_STAGES.has(stage)) {
|
|
24
|
+
return Promise.reject(new Error(`unknown stage: ${stage}`));
|
|
25
|
+
}
|
|
26
|
+
if (!fs.existsSync(workspaceDir)) {
|
|
27
|
+
return Promise.reject(new Error(`workspace dir does not exist: ${workspaceDir}`));
|
|
28
|
+
}
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const worker = new Worker(WORKER_SCRIPT, { workerData: { workspaceDir, stage } });
|
|
31
|
+
worker.on('message', (m) => { void worker.terminate(); resolve(m); });
|
|
32
|
+
worker.on('error', (e) => reject(e));
|
|
33
|
+
worker.on('exit', (code) => {
|
|
34
|
+
if (code !== 0)
|
|
35
|
+
reject(new Error(`worker stage ${stage} exited with ${code}`));
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
describe('Journey 11 — Restart Safety (独立 Worker 逐阶段推进)', () => {
|
|
40
|
+
it('每阶段重启后: 状态保留、零重复任务/approval/activation', { timeout: 180_000 }, async () => {
|
|
41
|
+
const workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-restart-'));
|
|
42
|
+
try {
|
|
43
|
+
// ── Worker 1: seed (evaluator needs_revision + repair seeded) ──
|
|
44
|
+
const s1 = await runStage(workspaceDir, 'seed');
|
|
45
|
+
expect(s1.tasks['evaluator-j11-prompt']).toBe('succeeded');
|
|
46
|
+
expect(s1.tasks['artificer-repair-j11-1']).toBe('pending');
|
|
47
|
+
expect(s1.approvals).toBe(0);
|
|
48
|
+
expect(s1.activations.length).toBe(0);
|
|
49
|
+
// ── Worker 2 (重启后): repair 完成 → commit → evaluator reopen ──
|
|
50
|
+
const s2 = await runStage(workspaceDir, 'repair-complete');
|
|
51
|
+
expect(s2.commit).toBe('revision_reopened');
|
|
52
|
+
expect(s2.tasks['evaluator-j11-prompt']).toBe('pending'); // reopen 存活
|
|
53
|
+
expect(s2.tasks['scribe-j11-prompt']).toBe('succeeded'); // 前置不丢
|
|
54
|
+
expect(s2.approvals).toBe(0);
|
|
55
|
+
expect(s2.activations.length).toBe(0);
|
|
56
|
+
// 幂等重放 (INV-8): 同 stage 再跑(consumer 重复周期)→ 不产生 rollout
|
|
57
|
+
const s2b = await runStage(workspaceDir, 'repair-complete');
|
|
58
|
+
expect(s2b.tasks['evaluator-j11-prompt']).toBe('pending');
|
|
59
|
+
expect(Object.keys(s2b.tasks).filter((id) => id.includes('rollout'))).toEqual([]);
|
|
60
|
+
// ── Worker 3 (重启后): evaluator 修订 approved → seed rollout ──
|
|
61
|
+
const s3 = await runStage(workspaceDir, 'evaluator-approved');
|
|
62
|
+
expect(s3.commit).toBe('successor_created');
|
|
63
|
+
expect(s3.tasks['rollout_reviewer-j11-prompt']).toBe('pending');
|
|
64
|
+
// 幂等重放: → successor_exists, rollout 任务数恒为 1
|
|
65
|
+
const s3b = await runStage(workspaceDir, 'evaluator-approved');
|
|
66
|
+
expect(s3b.commit).toBe('successor_exists');
|
|
67
|
+
const rolloutCount = Object.keys(s3b.tasks).filter((id) => id.startsWith('rollout_reviewer-')).length;
|
|
68
|
+
expect(rolloutCount).toBe(1);
|
|
69
|
+
// ── Worker 4 (重启后): rollout approve_rollout → 自动 dispatch ──
|
|
70
|
+
const s4 = await runStage(workspaceDir, 'rollout-approve');
|
|
71
|
+
expect(s4.runStatus).toBe('succeeded');
|
|
72
|
+
expect(s4.activations.length).toBe(1);
|
|
73
|
+
expect(s4.activations[0]?.action).toBe('prompt_activate');
|
|
74
|
+
expect(s4.approvals).toBe(0); // 低风险自动路径零审批打扰
|
|
75
|
+
// 幂等重放 dispatch: rollout 已 succeeded(lease 拒绝)→ activation 不重复
|
|
76
|
+
const s4b = await runStage(workspaceDir, 'rollout-approve');
|
|
77
|
+
expect(s4b.activations.length).toBe(1);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
try {
|
|
81
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
catch { /* temp */ }
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
it('A: crash-after-succeeded → 新 consumer 周期自动恢复 successor,恰好一次,重放无重复', { timeout: 180_000 }, async () => {
|
|
87
|
+
const workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-restart-a-'));
|
|
88
|
+
try {
|
|
89
|
+
// 进程 1: 常规链至 evaluator needs_revision + repair seeded
|
|
90
|
+
const s1 = await runStage(workspaceDir, 'seed');
|
|
91
|
+
expect(s1.tasks['evaluator-j11-prompt']).toBe('succeeded');
|
|
92
|
+
// 进程 2: repair 完成 + commit (evaluator reopen) — 常规路径
|
|
93
|
+
const s2 = await runStage(workspaceDir, 'repair-complete');
|
|
94
|
+
expect(s2.commit).toBe('revision_reopened');
|
|
95
|
+
// 进程 3: evaluator 修订轮 approved 已持久化, 但 commit 前 crash
|
|
96
|
+
const s3 = await runStage(workspaceDir, 'eval-approved-nocommit');
|
|
97
|
+
expect(s3.tasks['evaluator-j11-prompt']).toBe('succeeded');
|
|
98
|
+
// crash 后果: rollout successor 缺失 (没有任何任务创建它)
|
|
99
|
+
expect(Object.keys(s3.tasks).filter((id) => id.includes('rollout'))).toEqual([]);
|
|
100
|
+
// 进程 4 (重启后的 auto-consumer): 只跑 reconciliation
|
|
101
|
+
const s4 = await runStage(workspaceDir, 'reconcile');
|
|
102
|
+
console.log('A-DEBUG s4:', JSON.stringify(s4.reconcile));
|
|
103
|
+
expect(s4.reconcile?.recovered).toBe(1);
|
|
104
|
+
expect(s4.tasks['rollout_reviewer-j11-prompt']).toBe('pending'); // 自动恢复
|
|
105
|
+
// 重放无重复: 再跑两次 reconciliation — successor_exists,无新增任务/重复出边
|
|
106
|
+
const s5 = await runStage(workspaceDir, 'reconcile');
|
|
107
|
+
const s6 = await runStage(workspaceDir, 'reconcile');
|
|
108
|
+
expect(s5.reconcile?.recovered).toBe(0);
|
|
109
|
+
expect(s6.reconcile?.recovered).toBe(0);
|
|
110
|
+
const rollouts = Object.keys(s6.tasks).filter((id) => id.startsWith('rollout_reviewer-'));
|
|
111
|
+
expect(rollouts.length).toBe(1);
|
|
112
|
+
expect(s6.tasks['rollout_reviewer-j11-prompt']).toBe('pending');
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
try {
|
|
116
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
117
|
+
}
|
|
118
|
+
catch { /* temp */ }
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
it('B: 同一 upstream revision wave 连续 reconcile 3 次 — successor revisionCount 只 +1', { timeout: 180_000 }, async () => {
|
|
122
|
+
const workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-restart-b-'));
|
|
123
|
+
try {
|
|
124
|
+
// 建立 cascade 前置: evaluator 修订轮 approved + 正常 commit (rollout 创建)
|
|
125
|
+
await runStage(workspaceDir, 'seed');
|
|
126
|
+
await runStage(workspaceDir, 'repair-complete'); // evaluator reopen rc=1
|
|
127
|
+
await runStage(workspaceDir, 'evaluator-approved'); // commit → rollout created
|
|
128
|
+
await runStage(workspaceDir, 'rollout-succeed'); // 下游 succeeded (cascade 可触发)
|
|
129
|
+
// 第二次 revision wave: evaluator 再次 approved 后 crash (无 commit)
|
|
130
|
+
await runStage(workspaceDir, 'eval-approved-nocommit');
|
|
131
|
+
// 第一次 reconcile: cascade reopen rollout rc 0→1
|
|
132
|
+
const r1 = await runStage(workspaceDir, 'reconcile');
|
|
133
|
+
expect(r1.reconcile?.recovered).toBeGreaterThanOrEqual(1);
|
|
134
|
+
// 用独立连接读取 successor 的 revisionCount (worker 摘要不含元数据)
|
|
135
|
+
const { SqliteConnection } = await import('@principles/core/runtime-v2');
|
|
136
|
+
const readRevisionCount = () => {
|
|
137
|
+
const conn = new SqliteConnection(workspaceDir);
|
|
138
|
+
try {
|
|
139
|
+
const row = conn.getDb().prepare("SELECT diagnostic_json FROM tasks WHERE task_id = 'rollout_reviewer-j11-prompt'").get();
|
|
140
|
+
if (!row?.diagnostic_json)
|
|
141
|
+
return -1;
|
|
142
|
+
const parsed = JSON.parse(row.diagnostic_json);
|
|
143
|
+
return parsed.pi_metadata?.revisionCount ?? 0;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
try {
|
|
147
|
+
conn.close();
|
|
148
|
+
}
|
|
149
|
+
catch { /* best-effort */ }
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const rc1 = readRevisionCount();
|
|
153
|
+
// 连续两次 reconciliation 重放 — 因果幂等: revisionCount 不变
|
|
154
|
+
await runStage(workspaceDir, 'reconcile');
|
|
155
|
+
await runStage(workspaceDir, 'reconcile');
|
|
156
|
+
expect(readRevisionCount()).toBe(rc1);
|
|
157
|
+
expect(rc1).toBe(1); // 整个 wave 只发生过一次 reopen
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
try {
|
|
161
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
162
|
+
}
|
|
163
|
+
catch { /* temp */ }
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=restart-safety.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-safety.e2e.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/restart-safety.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict-drift-regressions.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.ts"],"names":[],"mappings":""}
|