@principles/core 1.270.4 → 1.271.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/runtime-v2/__tests__/evaluator-repair-loop.test.js +20 -0
- package/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js +26 -5
- package/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +7 -1
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +4 -0
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/evaluator-prompt-builder.test.js +1 -1
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js +15 -14
- package/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/owner-decision-architecture.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision-architecture.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision-architecture.test.js +56 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision-architecture.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +883 -0
- package/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/owner-override-resume.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/owner-override-resume.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/owner-override-resume.test.js +328 -0
- package/dist/runtime-v2/internalization/__tests__/owner-override-resume.test.js.map +1 -0
- package/dist/runtime-v2/internalization/evaluator-output.d.ts +63 -2
- package/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-output.js +139 -2
- package/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts +54 -2
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.js +49 -2
- package/dist/runtime-v2/internalization/evaluator-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts +34 -0
- package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/evaluator-runner.js +295 -12
- package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/internalization-orchestrator.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/internalization-orchestrator.js +10 -54
- package/dist/runtime-v2/internalization/internalization-orchestrator.js.map +1 -1
- package/dist/runtime-v2/internalization/internalization-transition-decision.d.ts +7 -1
- package/dist/runtime-v2/internalization/internalization-transition-decision.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/internalization-transition-decision.js +9 -2
- package/dist/runtime-v2/internalization/internalization-transition-decision.js.map +1 -1
- package/dist/runtime-v2/internalization/owner-resolution-service.d.ts +89 -0
- package/dist/runtime-v2/internalization/owner-resolution-service.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/owner-resolution-service.js +272 -0
- package/dist/runtime-v2/internalization/owner-resolution-service.js.map +1 -0
- package/dist/runtime-v2/internalization/owner-retry.d.ts +12 -0
- package/dist/runtime-v2/internalization/owner-retry.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/owner-retry.js +23 -0
- package/dist/runtime-v2/internalization/owner-retry.js.map +1 -1
- package/dist/runtime-v2/internalization/owner-review.d.ts +195 -0
- package/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/owner-review.js +470 -0
- package/dist/runtime-v2/internalization/owner-review.js.map +1 -0
- package/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +5 -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 +68 -0
- package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/pitask-metadata.js +104 -0
- package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/dist/runtime-v2/internalization/revision-reopen.d.ts +56 -0
- package/dist/runtime-v2/internalization/revision-reopen.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/revision-reopen.js +144 -0
- package/dist/runtime-v2/internalization/revision-reopen.js.map +1 -0
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts +12 -0
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.js +145 -14
- package/dist/runtime-v2/internalization/rollout-reviewer-runner.js.map +1 -1
- package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js +1 -0
- package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js.map +1 -1
- package/dist/runtime-v2/store/runtime-state-manager.d.ts +6 -0
- package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/dist/runtime-v2/store/runtime-state-manager.js +9 -0
- package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.d.ts +2 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.js +78 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.js.map +1 -0
- package/dist/runtime-v2/store/task/memory-task-store.d.ts +1 -0
- package/dist/runtime-v2/store/task/memory-task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/memory-task-store.js +8 -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 +1 -0
- package/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/sqlite-task-store.js +52 -0
- package/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/dist/runtime-v2/store/task/task-store.d.ts +9 -0
- package/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/workspace-isolation.test.js +1 -0
- package/dist/runtime-v2/store/workspace-isolation.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-resolution-service.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-resolution-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,OAAO,EAIL,KAAK,qBAAqB,EAE1B,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAgC,MAAM,sBAAsB,CAAC;AAK3F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,cAAc,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,eAAe,EAAE,OAAO,CAAC;CAC1B,GACD;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC9B;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/D;IAAE,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,cAAc,EAAE,qBAAqB,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,0BAA0B,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAC;CAC/D;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,mBAAmB,GAAG,sBAAsB,CAanG;AAED,kEAAkE;AAClE,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOzE;AAoID;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,EAC9B,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAqIjC"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* owner-resolution-service.ts — PRI-629 Owner 裁决的应用层(Console/CLI 共用)。
|
|
3
|
+
*
|
|
4
|
+
* 职责: 校验 reviewKey(stale 防护)→ CAS 写入 OwnerResolutionRecord →
|
|
5
|
+
* 按动作分派:
|
|
6
|
+
* - accept_current / reject_current (verdict override): 写 pending resolution
|
|
7
|
+
* 并把任务原子翻回 pending(保留 runnerDecision/completionIntent — 与
|
|
8
|
+
* owner-retry 的 authority reset 相反);实际效果由 runner 的入口恢复门
|
|
9
|
+
* 在 LLM 之前应用(SPEC §10: pending Owner Resolution 优先于 pending
|
|
10
|
+
* Completion Intent 优先于 normal LLM invocation)。
|
|
11
|
+
* - revise_once: 解析修订目标 → 以 resolution-scoped causeId reopen
|
|
12
|
+
* (幂等)→ 标 applied。不开自动预算,repairIteration 不变(SPEC §11)。
|
|
13
|
+
*
|
|
14
|
+
* 并发语义(SPEC §7): same reviewKey + same action → idempotent success;
|
|
15
|
+
* same reviewKey + different action → already_resolved;全部经
|
|
16
|
+
* updateTaskIfDiagnosticJsonUnchanged 单 SQL conditional mutation。
|
|
17
|
+
*/
|
|
18
|
+
import { createHash } from 'node:crypto';
|
|
19
|
+
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata, } from './pitask-metadata.js';
|
|
20
|
+
import { collectOwnerDecisionFacts, deriveOwnerDecisionCapability, effectiveDecisionFor, findOwnerResolutionForCurrentEpoch, } from './owner-review.js';
|
|
21
|
+
import { reopenTaskForRevision, resolveRolloutRevisionTarget } from './revision-reopen.js';
|
|
22
|
+
const CAS_ATTEMPTS = 3;
|
|
23
|
+
const OWNER_INSTRUCTION_MAX_CHARS = 500;
|
|
24
|
+
/** RuntimeStateManager → OwnerDecisionFactStore 的窄适配(pi artifacts 经专用 store)。 */
|
|
25
|
+
export function factStoreFromStateManager(stateManager) {
|
|
26
|
+
return {
|
|
27
|
+
getTask: (taskId) => stateManager.getTask(taskId),
|
|
28
|
+
listArtifactsBySourceTask: async (taskId) => {
|
|
29
|
+
const artifacts = await stateManager.piArtifactStore.listBySourceTaskId(taskId);
|
|
30
|
+
return artifacts.map((a) => ({
|
|
31
|
+
artifactId: a.artifactId,
|
|
32
|
+
artifactKind: a.artifactKind,
|
|
33
|
+
validationStatus: a.validationStatus,
|
|
34
|
+
contentJson: a.contentJson,
|
|
35
|
+
}));
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** revise_once 可选短指导的有界消毒(SPEC §13)— 仅作 revision feedback,非命令。 */
|
|
40
|
+
export function sanitizeOwnerInstruction(raw) {
|
|
41
|
+
if (typeof raw !== 'string')
|
|
42
|
+
return undefined;
|
|
43
|
+
// 控制字符替换为空格;截断到有界长度;空串 → undefined。
|
|
44
|
+
// eslint-disable-next-line no-control-regex -- 剥离控制字符正是本函数的目的(消毒不可信输入)
|
|
45
|
+
const cleaned = raw.replace(/[\u0000-\u001f\u007f]/g, ' ').trim();
|
|
46
|
+
if (!cleaned)
|
|
47
|
+
return undefined;
|
|
48
|
+
return cleaned.slice(0, OWNER_INSTRUCTION_MAX_CHARS);
|
|
49
|
+
}
|
|
50
|
+
/** reviewKey → 确定性 resolutionId(同 reviewKey 重放天然同 id)。 */
|
|
51
|
+
function resolutionIdFor(reviewKey) {
|
|
52
|
+
return `ores_${createHash('sha256').update(reviewKey, 'utf8').digest('hex').slice(0, 20)}`;
|
|
53
|
+
}
|
|
54
|
+
function resolvedOutcome(record, applied, _now) {
|
|
55
|
+
return {
|
|
56
|
+
status: 'resolved',
|
|
57
|
+
resolutionId: record.resolutionId,
|
|
58
|
+
reviewKey: record.reviewKey,
|
|
59
|
+
action: record.action,
|
|
60
|
+
applied,
|
|
61
|
+
...(record.effectiveDecision !== undefined ? { effectiveDecision: record.effectiveDecision } : {}),
|
|
62
|
+
...(record.targetTaskId !== undefined ? { targetTaskId: record.targetTaskId } : {}),
|
|
63
|
+
runnerWillApply: record.action !== 'revise_once' && !applied,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function resolveReviseTarget(deps, piTask) {
|
|
67
|
+
if (!piTask)
|
|
68
|
+
return null;
|
|
69
|
+
if (piTask.taskKind === 'evaluator') {
|
|
70
|
+
// 最新 repair Artificer = 当前依赖链上的 artificer(budget 耗尽的那轮)
|
|
71
|
+
for (const depId of piTask.dependencyTaskIds) {
|
|
72
|
+
const dep = await deps.stateManager.getTask(depId);
|
|
73
|
+
if (dep?.taskKind === 'artificer')
|
|
74
|
+
return { taskId: dep.taskId };
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const target = await resolveRolloutRevisionTarget((id) => deps.stateManager.getTask(id), piTask.taskId, piTask.channel ?? 'prompt');
|
|
79
|
+
return target ? { taskId: target.taskId } : null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* revise_once 的驱动/恢复:reopen(causeId 幂等)→ 标 applied。
|
|
83
|
+
* reopen 失败 → 回滚 pending 记录(恢复上一个 diagnosticJson),Owner 可重试。
|
|
84
|
+
*/
|
|
85
|
+
async function rollbackPendingResolution(stateManager, taskId, resolutionId) {
|
|
86
|
+
const raw = await stateManager.getTask(taskId);
|
|
87
|
+
const piTask = raw ? hydratePITaskRecord(raw) : null;
|
|
88
|
+
if (!piTask?.ownerResolutions)
|
|
89
|
+
return;
|
|
90
|
+
const filtered = piTask.ownerResolutions.filter((r) => r.resolutionId !== resolutionId);
|
|
91
|
+
if (filtered.length === piTask.ownerResolutions.length)
|
|
92
|
+
return;
|
|
93
|
+
await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, raw?.diagnosticJson ?? null, {
|
|
94
|
+
diagnosticJson: createPITaskDiagnosticJson(mergePITaskMetadata(piTask, { ownerResolutions: filtered })),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async function driveReviseOnce(args) {
|
|
98
|
+
const { deps, taskId, record, now, reopen } = args;
|
|
99
|
+
const { stateManager } = deps;
|
|
100
|
+
const { targetTaskId } = record;
|
|
101
|
+
const causeId = record.targetRevisionCauseId ?? `owner-res-${record.resolutionId}`;
|
|
102
|
+
if (!targetTaskId) {
|
|
103
|
+
return { status: 'revise_target_unresolved' };
|
|
104
|
+
}
|
|
105
|
+
const reopenOutcome = await reopen(stateManager, targetTaskId, {
|
|
106
|
+
revisionCauseId: causeId,
|
|
107
|
+
revisionFeedback: record.ownerInstruction,
|
|
108
|
+
reason: 'owner_revise_once',
|
|
109
|
+
});
|
|
110
|
+
if (!reopenOutcome.ok) {
|
|
111
|
+
await rollbackPendingResolution(stateManager, taskId, record.resolutionId);
|
|
112
|
+
return { status: 'revise_reopen_failed', reason: reopenOutcome.reason };
|
|
113
|
+
}
|
|
114
|
+
// reopen 已 materialize → 标 applied(CAS;失败由重放收敛)
|
|
115
|
+
const fresh = await stateManager.getTask(taskId);
|
|
116
|
+
const freshPi = fresh ? hydratePITaskRecord(fresh) : null;
|
|
117
|
+
if (freshPi?.ownerResolutions) {
|
|
118
|
+
const updatedRecords = freshPi.ownerResolutions.map((r) => r.resolutionId === record.resolutionId
|
|
119
|
+
? { ...r, status: 'applied', appliedAt: now() }
|
|
120
|
+
: r);
|
|
121
|
+
const nextMeta = mergePITaskMetadata(freshPi, { ownerResolutions: updatedRecords });
|
|
122
|
+
const updated = await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, fresh?.diagnosticJson ?? null, { diagnosticJson: createPITaskDiagnosticJson(nextMeta) });
|
|
123
|
+
if (updated) {
|
|
124
|
+
return {
|
|
125
|
+
status: 'resolved',
|
|
126
|
+
resolutionId: record.resolutionId,
|
|
127
|
+
reviewKey: record.reviewKey,
|
|
128
|
+
action: record.action,
|
|
129
|
+
applied: true,
|
|
130
|
+
targetTaskId,
|
|
131
|
+
runnerWillApply: false,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// applied 标记写失败 — reopen 幂等,重放会补标记
|
|
136
|
+
return {
|
|
137
|
+
status: 'resolved',
|
|
138
|
+
resolutionId: record.resolutionId,
|
|
139
|
+
reviewKey: record.reviewKey,
|
|
140
|
+
action: record.action,
|
|
141
|
+
applied: false,
|
|
142
|
+
targetTaskId,
|
|
143
|
+
runnerWillApply: false,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export async function applyOwnerResolution(deps, args) {
|
|
147
|
+
const { taskId, request, identity } = args;
|
|
148
|
+
const now = deps.now ?? (() => new Date().toISOString());
|
|
149
|
+
const reopen = deps.reopenTaskForRevision ?? reopenTaskForRevision;
|
|
150
|
+
const { stateManager } = deps;
|
|
151
|
+
// 1) Fresh durable facts + capability(不信任请求体中的任何事实断言)。
|
|
152
|
+
const facts = await collectOwnerDecisionFacts(factStoreFromStateManager(stateManager), taskId);
|
|
153
|
+
if (!facts) {
|
|
154
|
+
const raw = await stateManager.getTask(taskId);
|
|
155
|
+
if (!raw)
|
|
156
|
+
return { status: 'not_found' };
|
|
157
|
+
return { status: 'metadata_invalid' };
|
|
158
|
+
}
|
|
159
|
+
const capability = deriveOwnerDecisionCapability(facts);
|
|
160
|
+
const existingForEpoch = findOwnerResolutionForCurrentEpoch(facts.task);
|
|
161
|
+
if (!capability.eligible && !existingForEpoch) {
|
|
162
|
+
return { status: 'not_decision_capable', blockers: capability.blockers };
|
|
163
|
+
}
|
|
164
|
+
// P1 评审修复 (SPEC §9): 服务端强制 allowedActions——UI 隐藏不够,直接调
|
|
165
|
+
// API 也不得提交 allowedActions 之外的动作 (治理状态完整性)。幂等重放
|
|
166
|
+
// (已存在同 reviewKey resolution) 不受此限——重复同一动作仍返回 resolved。
|
|
167
|
+
if (!existingForEpoch && !capability.allowedActions.includes(request.action)) {
|
|
168
|
+
return {
|
|
169
|
+
status: 'not_decision_capable',
|
|
170
|
+
blockers: [`action_not_permitted:${request.action}`],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// 2) Stale 防护 (SPEC §6/§28): 服务端重读 durable facts,逐字段比对请求的
|
|
174
|
+
// expected* 断言 + 重算 reviewKey。任一变化 → 409 stale — Owner 只能
|
|
175
|
+
// 批准自己实际看到的那个版本。已存在同 reviewKey resolution 的
|
|
176
|
+
// idempotent 重放放行到 CAS 段处理。
|
|
177
|
+
if (!existingForEpoch || existingForEpoch.reviewKey !== request.reviewKey) {
|
|
178
|
+
const artifact = facts.decisionArtifact;
|
|
179
|
+
const freshRunId = facts.task.humanReviewContext?.sourceRunId
|
|
180
|
+
?? facts.task.completionIntent?.sourceRunId ?? '';
|
|
181
|
+
const stale = capability.reviewKey !== request.reviewKey
|
|
182
|
+
|| (facts.task.revisionCount ?? 0) !== request.expectedRevisionEpoch
|
|
183
|
+
|| freshRunId !== request.expectedSourceRunId
|
|
184
|
+
|| artifact?.artifactId !== request.expectedSourceArtifactId
|
|
185
|
+
|| artifact?.contentHash !== request.expectedSourceArtifactHash;
|
|
186
|
+
if (stale) {
|
|
187
|
+
return { status: 'stale_owner_decision' };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// 3) CAS 段
|
|
191
|
+
for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {
|
|
192
|
+
const raw = await stateManager.getTask(taskId);
|
|
193
|
+
if (!raw)
|
|
194
|
+
return { status: 'not_found' };
|
|
195
|
+
const piTask = hydratePITaskRecord(raw);
|
|
196
|
+
if (!piTask)
|
|
197
|
+
return { status: 'metadata_invalid' };
|
|
198
|
+
const existing = findOwnerResolutionForCurrentEpoch(piTask);
|
|
199
|
+
if (existing) {
|
|
200
|
+
if (existing.reviewKey !== request.reviewKey) {
|
|
201
|
+
// 同 epoch 已被另一个事实快照的裁决占用 — 冲突。
|
|
202
|
+
return { status: 'already_resolved', existingAction: existing.action };
|
|
203
|
+
}
|
|
204
|
+
if (existing.action !== request.action) {
|
|
205
|
+
return { status: 'already_resolved', existingAction: existing.action };
|
|
206
|
+
}
|
|
207
|
+
// same reviewKey + same action — idempotent
|
|
208
|
+
if (existing.status === 'applied') {
|
|
209
|
+
return resolvedOutcome(existing, true, now);
|
|
210
|
+
}
|
|
211
|
+
// pending 同动作:
|
|
212
|
+
if (request.action === 'revise_once') {
|
|
213
|
+
return await driveReviseOnce({ deps, reopen, taskId, taskWithRecord: raw, record: existing, now });
|
|
214
|
+
}
|
|
215
|
+
// verdict override pending — 任务应已翻回 pending,等 runner 恢复门应用
|
|
216
|
+
return resolvedOutcome(existing, false, now);
|
|
217
|
+
}
|
|
218
|
+
if (piTask.status !== 'needs_human_review') {
|
|
219
|
+
return { status: 'not_decision_capable', blockers: [`task_status_${piTask.status}`] };
|
|
220
|
+
}
|
|
221
|
+
// 首次写入
|
|
222
|
+
const reviewKey = capability.reviewKey ?? request.reviewKey;
|
|
223
|
+
let record = {
|
|
224
|
+
resolutionId: resolutionIdFor(reviewKey),
|
|
225
|
+
reviewKey,
|
|
226
|
+
action: request.action,
|
|
227
|
+
status: 'pending',
|
|
228
|
+
ownerId: identity.ownerId,
|
|
229
|
+
...(identity.credentialId !== undefined ? { credentialId: identity.credentialId } : {}),
|
|
230
|
+
decidedAt: now(),
|
|
231
|
+
sourceRunId: request.expectedSourceRunId,
|
|
232
|
+
sourceArtifactId: request.expectedSourceArtifactId,
|
|
233
|
+
sourceArtifactHash: request.expectedSourceArtifactHash,
|
|
234
|
+
revisionEpoch: piTask.revisionCount ?? 0,
|
|
235
|
+
machineDecision: piTask.runnerDecision ?? 'needs_revision',
|
|
236
|
+
...(request.action !== 'revise_once'
|
|
237
|
+
? { effectiveDecision: effectiveDecisionFor(piTask.taskKind, request.action) }
|
|
238
|
+
: {}),
|
|
239
|
+
...(request.action === 'revise_once'
|
|
240
|
+
? { ownerInstruction: sanitizeOwnerInstruction(request.ownerInstruction) }
|
|
241
|
+
: {}),
|
|
242
|
+
};
|
|
243
|
+
if (request.action === 'revise_once') {
|
|
244
|
+
const target = await resolveReviseTarget(deps, piTask);
|
|
245
|
+
if (!target) {
|
|
246
|
+
return { status: 'revise_target_unresolved' };
|
|
247
|
+
}
|
|
248
|
+
record = { ...record, targetTaskId: target.taskId, targetRevisionCauseId: `owner-res-${record.resolutionId}` };
|
|
249
|
+
const nextMeta = mergePITaskMetadata(piTask, {
|
|
250
|
+
ownerResolutions: [...(piTask.ownerResolutions ?? []), record],
|
|
251
|
+
});
|
|
252
|
+
const updated = await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, raw.diagnosticJson ?? null, { diagnosticJson: createPITaskDiagnosticJson(nextMeta) });
|
|
253
|
+
if (!updated)
|
|
254
|
+
continue; // CAS 冲突 → 重读重试
|
|
255
|
+
return await driveReviseOnce({ deps, reopen, taskId, taskWithRecord: updated, record, now });
|
|
256
|
+
}
|
|
257
|
+
// verdict override: resolution + status 翻转同一 mutation
|
|
258
|
+
const nextMeta = mergePITaskMetadata(piTask, {
|
|
259
|
+
ownerResolutions: [...(piTask.ownerResolutions ?? []), record],
|
|
260
|
+
});
|
|
261
|
+
const updated = await stateManager.updateTaskIfDiagnosticJsonUnchanged(taskId, raw.diagnosticJson ?? null, {
|
|
262
|
+
status: 'pending',
|
|
263
|
+
attemptCount: 0,
|
|
264
|
+
diagnosticJson: createPITaskDiagnosticJson(nextMeta),
|
|
265
|
+
});
|
|
266
|
+
if (!updated)
|
|
267
|
+
continue;
|
|
268
|
+
return resolvedOutcome(record, false, now);
|
|
269
|
+
}
|
|
270
|
+
return { status: 'cas_conflict' };
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=owner-resolution-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-resolution-service.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-resolution-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,18 @@ export type OwnerRetryOutcome = {
|
|
|
30
30
|
status: 'requeued';
|
|
31
31
|
taskKind: string;
|
|
32
32
|
previousStatus: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* PRI-629 Recover guard: decision-capable 人工裁决(或本 epoch 已有
|
|
36
|
+
* resolution)不允许 authority reset — Recover 不是治理出口(SPEC §17/INV-06)。
|
|
37
|
+
* 出口 = 治理焦点的 Owner Decision(open_governance_focus)。
|
|
38
|
+
*/
|
|
39
|
+
| {
|
|
40
|
+
status: 'rejected';
|
|
41
|
+
taskKind: string;
|
|
42
|
+
previousStatus: string;
|
|
43
|
+
reason: 'owner_decision_required';
|
|
44
|
+
nextAction: 'open_governance_focus';
|
|
33
45
|
};
|
|
34
46
|
/**
|
|
35
47
|
* 对单个 needs_human_review 任务执行 Owner authority reset(→ pending)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-retry.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"owner-retry.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAS7E,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE;AAClE;;;;GAIG;GACD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAE7I;;;;;;;;;;;;;GAaG;AACH,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,mBAAmB,EACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CA4D5B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata } from './pitask-metadata.js';
|
|
2
|
+
import { collectOwnerDecisionFacts, deriveOwnerDecisionCapability, findPendingOwnerResolutionForCurrentEpoch, } from './owner-review.js';
|
|
3
|
+
import { factStoreFromStateManager } from './owner-resolution-service.js';
|
|
2
4
|
/**
|
|
3
5
|
* 对单个 needs_human_review 任务执行 Owner authority reset(→ pending)。
|
|
4
6
|
*
|
|
@@ -33,6 +35,27 @@ export async function ownerRetryNeedsHumanReviewTask(stateManager, taskId) {
|
|
|
33
35
|
}
|
|
34
36
|
// 原子单写: 同一 patch 同时落 status=pending / attemptCount=0 / 清空后的
|
|
35
37
|
// diagnosticJson。updateTask 抛错时 DB 行保持原样(单条 UPDATE),无 partial reset。
|
|
38
|
+
// ── PRI-629 Recover guard (SPEC §17) ──
|
|
39
|
+
// decision-capable(capability eligible)或本 epoch 已有 resolution(含
|
|
40
|
+
// revise_once 进行中)→ 拒绝。模糊 legacy 事实 → 不阻断(capability 不
|
|
41
|
+
// eligible),保持既有 Recover 行为。core 层强制 — 不只是 UI 隐藏按钮。
|
|
42
|
+
const facts = await collectOwnerDecisionFacts(factStoreFromStateManager(stateManager), taskId);
|
|
43
|
+
if (facts) {
|
|
44
|
+
const capability = deriveOwnerDecisionCapability(facts);
|
|
45
|
+
// P0 评审修复: 只拒 pending resolution(等待 runner 应用,此时 Recover
|
|
46
|
+
// 会与之竞争)。applied resolution 的下游 recovery NHR 必须保持 Recover
|
|
47
|
+
// 出口——resume 门会基于 applied override 确定性重放,否则任务死胡同
|
|
48
|
+
// (Focus 不显示决策、Recover 又被拒)。
|
|
49
|
+
if (capability.eligible || findPendingOwnerResolutionForCurrentEpoch(facts.task)) {
|
|
50
|
+
return {
|
|
51
|
+
status: 'rejected',
|
|
52
|
+
taskKind: task.taskKind,
|
|
53
|
+
previousStatus: task.status,
|
|
54
|
+
reason: 'owner_decision_required',
|
|
55
|
+
nextAction: 'open_governance_focus',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
36
59
|
const merged = mergePITaskMetadata(piTask, {
|
|
37
60
|
runnerDecision: undefined,
|
|
38
61
|
completionIntent: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-retry.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-retry.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"owner-retry.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-retry.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,yCAAyC,GAC1C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAc1E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,YAAiC,EACjC,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qDAAqD;QACrD,+CAA+C;QAC/C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjE,CAAC;IAED,4DAA4D;IAC5D,qEAAqE;IACrE,yCAAyC;IACzC,gEAAgE;IAChE,uDAAuD;IACvD,oDAAoD;IACpD,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,yBAAyB,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/F,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC;QACxD,yDAAyD;QACzD,0DAA0D;QAC1D,iDAAiD;QACjD,6BAA6B;QAC7B,IAAI,UAAU,CAAC,QAAQ,IAAI,yCAAyC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjF,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,cAAc,EAAE,IAAI,CAAC,MAAM;gBAC3B,MAAM,EAAE,yBAAyB;gBACjC,UAAU,EAAE,uBAAuB;aACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE;QACzC,cAAc,EAAE,SAAS;QACzB,gBAAgB,EAAE,SAAS;KAC5B,CAAC,CAAC;IACH,MAAM,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE;QACpC,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,0BAA0B,CAAC,MAAM,CAAC;KACnD,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc,EAAE,IAAI,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* owner-review.ts — PRI-629 统一 Owner Decision 策略层(纯函数 + 窄事实读取)。
|
|
3
|
+
*
|
|
4
|
+
* 职责(单一深模块,Console/CLI/Runner 共用,禁止各自再推导):
|
|
5
|
+
* - collectOwnerDecisionFacts 读取 durable facts(task/lineage/artifact)
|
|
6
|
+
* - deriveOwnerDecisionCapability 纯策略:该 NHR 任务是否 decision-capable、
|
|
7
|
+
* 允许哪些 Owner 动作(INV-01 的唯一依据)
|
|
8
|
+
* - buildOwnerReviewKey 裁决事实快照的稳定 hash(stale 防护)
|
|
9
|
+
* - resolveEffectiveRunnerDecision effective decision 的唯一解析点
|
|
10
|
+
* - classifyHumanReviewAttention owner_decision vs recovery(fail closed)
|
|
11
|
+
*
|
|
12
|
+
* 不变式(SPEC PRI-629/630):
|
|
13
|
+
* - machine verdict 永不被覆盖(runnerDecision 只读)
|
|
14
|
+
* - allowedActions.length === 0 ⇔ 不进 Owner Inbox、不阻止 Recover
|
|
15
|
+
* - 未知 reasonCode / 模糊 legacy 事实 → recovery(fail closed)
|
|
16
|
+
* - reviewKey 绑定 (taskId, epoch, run, artifact, hash, verdict, reason)
|
|
17
|
+
*/
|
|
18
|
+
import type { TaskRecord } from '../task-status.js';
|
|
19
|
+
import type { PITaskRecord } from './peer-runner-contracts.js';
|
|
20
|
+
import { type OwnerResolutionAction, type OwnerResolutionRecord, type RunnerDecision } from './pitask-metadata.js';
|
|
21
|
+
/**
|
|
22
|
+
* needs_human_review 的结构化原因码(PRI-629)。写入侧由 runner 使用常量;
|
|
23
|
+
* 解析侧接受任意非空串(前向兼容),分类侧只认 DECISION_CAPABLE 集合,
|
|
24
|
+
* 其余一律 recovery。
|
|
25
|
+
*/
|
|
26
|
+
export declare const HUMAN_REVIEW_REASON: {
|
|
27
|
+
/** Evaluator 修复预算耗尽(2 轮已用完)— Owner 可裁决 */
|
|
28
|
+
readonly evaluatorRepairBudgetExhausted: 'evaluator_repair_budget_exhausted';
|
|
29
|
+
/** Rollout 修订预算耗尽 — Owner 可裁决 */
|
|
30
|
+
readonly rolloutRevisionBudgetExhausted: 'rollout_revision_budget_exhausted';
|
|
31
|
+
readonly evaluatorRepairSeedFailed: 'evaluator_repair_seed_failed';
|
|
32
|
+
readonly rolloutActivationCandidateUnresolved: 'rollout_activation_candidate_unresolved';
|
|
33
|
+
readonly rolloutDispatchNotWired: 'rollout_dispatch_not_wired';
|
|
34
|
+
readonly rolloutDispatchRefused: 'rollout_dispatch_refused';
|
|
35
|
+
readonly rolloutRevisionTargetUnresolved: 'rollout_revision_target_unresolved';
|
|
36
|
+
readonly rolloutRevisionRoutingNotWired: 'rollout_revision_routing_not_wired';
|
|
37
|
+
readonly rolloutRevisionReopenFailed: 'rollout_revision_reopen_failed';
|
|
38
|
+
readonly rolloutRevisionIterationMissing: 'rollout_revision_iteration_missing';
|
|
39
|
+
readonly workspaceDirtyStall: 'workspace_dirty_stall';
|
|
40
|
+
};
|
|
41
|
+
export type HumanReviewReasonCode = typeof HUMAN_REVIEW_REASON[keyof typeof HUMAN_REVIEW_REASON];
|
|
42
|
+
/** decision-capable 原因集合 — 只有这些允许 Owner verdict override。 */
|
|
43
|
+
export declare const DECISION_CAPABLE_HUMAN_REVIEW_REASONS: ReadonlySet<string>;
|
|
44
|
+
/** legacy(无 humanReviewContext)判定后使用的原因码,携带 _legacy 后缀以示证据来源。 */
|
|
45
|
+
export declare const LEGACY_EVALUATOR_BUDGET_EXHAUSTED = "evaluator_repair_budget_exhausted_legacy";
|
|
46
|
+
export declare const LEGACY_ROLLOUT_BUDGET_EXHAUSTED = "rollout_revision_budget_exhausted_legacy";
|
|
47
|
+
/** 事实读取所需的最窄接口 — RuntimeStateManager 天然满足前两项。 */
|
|
48
|
+
export interface OwnerDecisionFactStore {
|
|
49
|
+
getTask(taskId: string): Promise<TaskRecord | null>;
|
|
50
|
+
listArtifactsBySourceTask(taskId: string): Promise<readonly DecisionArtifactRecord[]>;
|
|
51
|
+
}
|
|
52
|
+
export interface DecisionArtifactRecord {
|
|
53
|
+
readonly artifactId: string;
|
|
54
|
+
readonly artifactKind: string;
|
|
55
|
+
readonly validationStatus: string;
|
|
56
|
+
readonly contentJson: string;
|
|
57
|
+
}
|
|
58
|
+
/** 决策输出 artifact(evaluator/rollout 名下的 kind='principle' 评审输出)。 */
|
|
59
|
+
export interface DecisionArtifactFacts {
|
|
60
|
+
readonly artifactId: string;
|
|
61
|
+
readonly contentHash: string;
|
|
62
|
+
}
|
|
63
|
+
/** collectOwnerDecisionFacts 的产物 — capability 的全部输入。 */
|
|
64
|
+
export interface OwnerDecisionFacts {
|
|
65
|
+
readonly task: PITaskRecord;
|
|
66
|
+
/** 决策输出 artifact(pi-art-<taskId>-<runId>);不存在 = null */
|
|
67
|
+
readonly decisionArtifact: DecisionArtifactFacts | null;
|
|
68
|
+
/** 决策 artifact 的确定性安全门(adversarial hard gate)失败 — accept 禁止 */
|
|
69
|
+
readonly hardGateFailed: boolean;
|
|
70
|
+
/** evaluator: 依赖链上 artificer 的 repairPayload.repairIteration(无 payload 的首轮 artificer = 0;无 artificer = null) */
|
|
71
|
+
readonly dependencyRepairIteration: number | null;
|
|
72
|
+
/** evaluator: 依赖 artificer 的 taskId(revise_once 的 reopen 目标;无 = null) */
|
|
73
|
+
readonly dependencyArtificerTaskId: string | null;
|
|
74
|
+
/** rollout: rolloutRevisionPayload 已 APPLIED 的修订轮数 */
|
|
75
|
+
readonly rolloutRevisionAppliedCount: number | null;
|
|
76
|
+
/** 依赖链可解析(evaluator: 依赖 artificer 任务存在;rollout: 依赖 evaluator 任务存在) */
|
|
77
|
+
readonly lineageResolvable: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** 对 artifact contentJson 计算 sha256 hex(reviewKey / stale 防护的事实输入)。 */
|
|
80
|
+
export declare function computeArtifactContentHash(contentJson: string): string;
|
|
81
|
+
/** evaluator/rollout 输出 artifact 的确定性 id(与 runner 写入约定一致)。 */
|
|
82
|
+
export declare function decisionArtifactIdFor(taskId: string, runId: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* 从 durable facts 还原裁决事实快照:
|
|
85
|
+
* 1. humanReviewContext 存在 → 直接采用(它由 runner 在 NHR 落库时原子写入);
|
|
86
|
+
* 2. legacy → completionIntent.sourceRunId + 确定性 artifact id + 内容 hash。
|
|
87
|
+
* 决策 artifact 必须真实存在且可读 — 缺失即 capability 失败(recovery)。
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* 硬确定性安全门判定(SPEC §20):evaluator V2 输出携带 adversarialResult
|
|
91
|
+
* 且 passed=false → 确定性对抗门失败,Owner 不得 accept(可 revise/reject)。
|
|
92
|
+
* 此处只读 metadata 可达的事实;artifact 内容级判定在 apply 阶段由 runner
|
|
93
|
+
* 的既有 deterministic gates 兜底(RuleHostWriter.canActivate / sandbox replay)。
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* verdict override 的 effective decision 映射(SPEC §10/§14/§16)。
|
|
97
|
+
* 注意 rollout accept → 'approve_rollout'(不是 'approved')— 高风险部署
|
|
98
|
+
* 审批由 ActivationDispatcher 在下游强制,Owner review 不穿透。
|
|
99
|
+
*/
|
|
100
|
+
export declare function effectiveDecisionFor(taskKind: string, action: OwnerResolutionAction): RunnerDecision | undefined;
|
|
101
|
+
export interface OwnerOverrideResumePlan {
|
|
102
|
+
readonly resolution: OwnerResolutionRecord;
|
|
103
|
+
readonly overrideDecision: RunnerDecision;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Runner 入口恢复门的第一优先级检查(SPEC §10):
|
|
107
|
+
* pending Owner Resolution → pending Completion Intent → normal LLM。
|
|
108
|
+
* 当前 epoch 存在 verdict override resolution(pending 或 applied 均可 —
|
|
109
|
+
* applied 但任务未 terminal 的 crash 窗口同样由此收敛)→ 返回 override 计划。
|
|
110
|
+
*/
|
|
111
|
+
export declare function planOwnerVerdictOverrideResume(piTask: PITaskRecord): OwnerOverrideResumePlan | null;
|
|
112
|
+
/**
|
|
113
|
+
* runner 侧 detail reason string → 规范化 humanReviewContext.reasonCode。
|
|
114
|
+
* 保留 detail 原串在事件里(可观测),context 携带规范码(可分类)。
|
|
115
|
+
*/
|
|
116
|
+
export declare function canonicalHumanReviewReasonCode(detail: string): string;
|
|
117
|
+
/**
|
|
118
|
+
* 硬确定性安全门判定(SPEC §9.1/§20):evaluator V2 输出携带
|
|
119
|
+
* adversarialResult 且 passed=false → 确定性对抗门失败 → accept_current
|
|
120
|
+
* 不允许(revise/reject 仍可用)。从决策 artifact contentJson 做有界解析。
|
|
121
|
+
*/
|
|
122
|
+
export declare function detectHardGateFailureFromArtifact(contentJson: string): boolean;
|
|
123
|
+
export declare function collectOwnerDecisionFacts(store: OwnerDecisionFactStore, taskId: string): Promise<OwnerDecisionFacts | null>;
|
|
124
|
+
export interface ReviewKeyFacts {
|
|
125
|
+
readonly taskId: string;
|
|
126
|
+
readonly revisionEpoch: number;
|
|
127
|
+
readonly sourceRunId: string;
|
|
128
|
+
readonly sourceArtifactId: string;
|
|
129
|
+
readonly sourceArtifactHash: string;
|
|
130
|
+
readonly machineDecision: string;
|
|
131
|
+
readonly humanReviewReason: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Owner Decision Item 的稳定身份:裁决事实快照的 sha256。任何一个事实变化
|
|
135
|
+
* (新一轮 run / 新 artifact / 新 epoch / 不同 verdict)都会产生新 key —
|
|
136
|
+
* Owner 只能批准自己实际看到的那个版本(stale 防护,SPEC §6)。
|
|
137
|
+
*/
|
|
138
|
+
export declare function buildOwnerReviewKey(facts: ReviewKeyFacts): string;
|
|
139
|
+
/**
|
|
140
|
+
* effective decision 的唯一解析点(SPEC §8):
|
|
141
|
+
* 当前 revision epoch 存在合法、applied 的 Owner verdict override →
|
|
142
|
+
* effectiveDecision;否则 → runnerDecision(机器判定,永不改写)。
|
|
143
|
+
*
|
|
144
|
+
* Internalization transition / orchestrator / 任何消费方必须经由本函数;
|
|
145
|
+
* Console / HTTP route / 各 runner 禁止自行计算。
|
|
146
|
+
*/
|
|
147
|
+
/** 当前 epoch 内最新一条 owner resolution(pending 或 applied),无则 null。 */
|
|
148
|
+
export declare function findOwnerResolutionForCurrentEpoch(piTask: PITaskRecord): OwnerResolutionRecord | null;
|
|
149
|
+
/**
|
|
150
|
+
* P0 评审修复: 当前 epoch 内是否有 **pending**(等待 runner 应用)的 resolution。
|
|
151
|
+
* Recover guard 只拒 pending——applied resolution 表示裁决已被执行(即使下游
|
|
152
|
+
* 治理转移因技术原因落在 recovery NHR),此时 Recover 是合法的技术重试出口
|
|
153
|
+
* (resume 门会基于 applied override 确定性重放,不重问 LLM)。
|
|
154
|
+
*/
|
|
155
|
+
export declare function findPendingOwnerResolutionForCurrentEpoch(piTask: PITaskRecord): OwnerResolutionRecord | null;
|
|
156
|
+
/** 当前 epoch 内最新 applied verdict override(accept/reject)— resolver 的输入。 */
|
|
157
|
+
export declare function findAppliedVerdictOverrideResolution(piTask: PITaskRecord): OwnerResolutionRecord | null;
|
|
158
|
+
export declare function resolveEffectiveRunnerDecision(piTask: PITaskRecord): RunnerDecision | undefined;
|
|
159
|
+
export type HumanReviewAttention = 'owner_decision' | 'recovery';
|
|
160
|
+
export interface OwnerDecisionCapability {
|
|
161
|
+
/** true ⇔ allowedActions.length > 0(INV-01 Actionability Truth) */
|
|
162
|
+
readonly eligible: boolean;
|
|
163
|
+
/** 规范化原因码(legacy 判定带 _legacy 后缀) */
|
|
164
|
+
readonly reasonCode: string;
|
|
165
|
+
readonly attention: HumanReviewAttention;
|
|
166
|
+
readonly legacy: boolean;
|
|
167
|
+
readonly reviewKey?: string;
|
|
168
|
+
readonly allowedActions: readonly OwnerResolutionAction[];
|
|
169
|
+
readonly blockers: readonly string[];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 规范化人工裁决原因:
|
|
173
|
+
* - 有 humanReviewContext → 其 reasonCode(未知码 → attention=recovery,fail closed);
|
|
174
|
+
* - legacy → 按 durable facts 推断(SPEC §23):
|
|
175
|
+
* evaluator: needs_revision + dep artificer repairIteration>=2 + 同 epoch
|
|
176
|
+
* pending intent → budget exhausted (legacy)
|
|
177
|
+
* rollout: needs_revision + applied revision count>=2 → budget exhausted (legacy)
|
|
178
|
+
* - 事实不足/歧义 → recovery(不得猜)。
|
|
179
|
+
*/
|
|
180
|
+
export declare function classifyHumanReviewAttention(facts: OwnerDecisionFacts): {
|
|
181
|
+
attention: HumanReviewAttention;
|
|
182
|
+
reasonCode: string;
|
|
183
|
+
legacy: boolean;
|
|
184
|
+
};
|
|
185
|
+
export declare function deriveOwnerDecisionCapability(facts: OwnerDecisionFacts): OwnerDecisionCapability;
|
|
186
|
+
/** resolution 标 applied(幂等,单调 pending→applied;并发同值写安全)。 */
|
|
187
|
+
export interface MarkOwnerResolutionAppliedCtx {
|
|
188
|
+
readonly updateDiagnosticJson: (taskId: string, json: string) => Promise<void>;
|
|
189
|
+
readonly getTask: (taskId: string) => Promise<TaskRecord | null>;
|
|
190
|
+
readonly taskId: string;
|
|
191
|
+
readonly resolutionId: string;
|
|
192
|
+
readonly appliedAt: string;
|
|
193
|
+
}
|
|
194
|
+
export declare function markOwnerResolutionApplied(ctx: MarkOwnerResolutionAppliedCtx): Promise<void>;
|
|
195
|
+
//# sourceMappingURL=owner-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-review.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/owner-review.ts"],"names":[],"mappings":"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"}
|