@principles/core 1.271.0 → 1.272.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.
Files changed (134) hide show
  1. package/dist/runtime-v2/__tests__/admission-gate.test.js +23 -6
  2. package/dist/runtime-v2/__tests__/admission-gate.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/adversarial-loop.test.js +22 -0
  4. package/dist/runtime-v2/__tests__/adversarial-loop.test.js.map +1 -1
  5. package/dist/runtime-v2/__tests__/context-payload-validation.test.js +1 -1
  6. package/dist/runtime-v2/__tests__/context-payload-validation.test.js.map +1 -1
  7. package/dist/runtime-v2/__tests__/evidence-guards.test.js +2 -2
  8. package/dist/runtime-v2/__tests__/evidence-guards.test.js.map +1 -1
  9. package/dist/runtime-v2/__tests__/golden-path-diagnostician-e2e.test.js +1 -1
  10. package/dist/runtime-v2/__tests__/golden-path-diagnostician-e2e.test.js.map +1 -1
  11. package/dist/runtime-v2/__tests__/governance-experience.test.js +19 -0
  12. package/dist/runtime-v2/__tests__/governance-experience.test.js.map +1 -1
  13. package/dist/runtime-v2/__tests__/pain-evidence-contract.test.js +3 -3
  14. package/dist/runtime-v2/__tests__/pain-evidence-contract.test.js.map +1 -1
  15. package/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +1 -1
  16. package/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
  17. package/dist/runtime-v2/__tests__/rollout-rule-candidate-contract.test.d.ts +2 -0
  18. package/dist/runtime-v2/__tests__/rollout-rule-candidate-contract.test.d.ts.map +1 -0
  19. package/dist/runtime-v2/__tests__/rollout-rule-candidate-contract.test.js +243 -0
  20. package/dist/runtime-v2/__tests__/rollout-rule-candidate-contract.test.js.map +1 -0
  21. package/dist/runtime-v2/admission-gate.d.ts +8 -1
  22. package/dist/runtime-v2/admission-gate.d.ts.map +1 -1
  23. package/dist/runtime-v2/admission-gate.js +14 -0
  24. package/dist/runtime-v2/admission-gate.js.map +1 -1
  25. package/dist/runtime-v2/context-payload.d.ts +9 -3
  26. package/dist/runtime-v2/context-payload.d.ts.map +1 -1
  27. package/dist/runtime-v2/context-payload.js +3 -1
  28. package/dist/runtime-v2/context-payload.js.map +1 -1
  29. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +2 -2
  30. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -1
  31. package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +1 -1
  32. package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -1
  33. package/dist/runtime-v2/evidence-triage/observation-resolver.js +2 -2
  34. package/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -1
  35. package/dist/runtime-v2/evidence-triage/types.d.ts +1 -1
  36. package/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
  37. package/dist/runtime-v2/evolution/evolution-types.d.ts +8 -4
  38. package/dist/runtime-v2/evolution/evolution-types.d.ts.map +1 -1
  39. package/dist/runtime-v2/evolution/evolution-types.js +3 -1
  40. package/dist/runtime-v2/evolution/evolution-types.js.map +1 -1
  41. package/dist/runtime-v2/governance-experience-contract.d.ts +16 -16
  42. package/dist/runtime-v2/governance-experience-contract.d.ts.map +1 -1
  43. package/dist/runtime-v2/governance-experience-contract.js +4 -1
  44. package/dist/runtime-v2/governance-experience-contract.js.map +1 -1
  45. package/dist/runtime-v2/governance-experience.d.ts.map +1 -1
  46. package/dist/runtime-v2/governance-experience.js +30 -8
  47. package/dist/runtime-v2/governance-experience.js.map +1 -1
  48. package/dist/runtime-v2/index.d.ts +5 -1
  49. package/dist/runtime-v2/index.d.ts.map +1 -1
  50. package/dist/runtime-v2/index.js +4 -1
  51. package/dist/runtime-v2/index.js.map +1 -1
  52. package/dist/runtime-v2/internalization/__tests__/artificer-code-bearing.test.d.ts +2 -0
  53. package/dist/runtime-v2/internalization/__tests__/artificer-code-bearing.test.d.ts.map +1 -0
  54. package/dist/runtime-v2/internalization/__tests__/artificer-code-bearing.test.js +114 -0
  55. package/dist/runtime-v2/internalization/__tests__/artificer-code-bearing.test.js.map +1 -0
  56. package/dist/runtime-v2/internalization/__tests__/evaluator-gate-authority.test.d.ts +2 -0
  57. package/dist/runtime-v2/internalization/__tests__/evaluator-gate-authority.test.d.ts.map +1 -0
  58. package/dist/runtime-v2/internalization/__tests__/evaluator-gate-authority.test.js +256 -0
  59. package/dist/runtime-v2/internalization/__tests__/evaluator-gate-authority.test.js.map +1 -0
  60. package/dist/runtime-v2/internalization/__tests__/owner-decision-review.test.d.ts +2 -0
  61. package/dist/runtime-v2/internalization/__tests__/owner-decision-review.test.d.ts.map +1 -0
  62. package/dist/runtime-v2/internalization/__tests__/owner-decision-review.test.js +229 -0
  63. package/dist/runtime-v2/internalization/__tests__/owner-decision-review.test.js.map +1 -0
  64. package/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +172 -1
  65. package/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -1
  66. package/dist/runtime-v2/internalization/__tests__/rule-activation-contract.test.d.ts +2 -0
  67. package/dist/runtime-v2/internalization/__tests__/rule-activation-contract.test.d.ts.map +1 -0
  68. package/dist/runtime-v2/internalization/__tests__/rule-activation-contract.test.js +187 -0
  69. package/dist/runtime-v2/internalization/__tests__/rule-activation-contract.test.js.map +1 -0
  70. package/dist/runtime-v2/internalization/artificer-code-bearing.d.ts +39 -0
  71. package/dist/runtime-v2/internalization/artificer-code-bearing.d.ts.map +1 -0
  72. package/dist/runtime-v2/internalization/artificer-code-bearing.js +33 -0
  73. package/dist/runtime-v2/internalization/artificer-code-bearing.js.map +1 -0
  74. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +11 -8
  75. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  76. package/dist/runtime-v2/internalization/evaluator-runner.js +170 -31
  77. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  78. package/dist/runtime-v2/internalization/index.d.ts +2 -0
  79. package/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  80. package/dist/runtime-v2/internalization/index.js +1 -0
  81. package/dist/runtime-v2/internalization/index.js.map +1 -1
  82. package/dist/runtime-v2/internalization/owner-decision-review.d.ts +98 -0
  83. package/dist/runtime-v2/internalization/owner-decision-review.d.ts.map +1 -0
  84. package/dist/runtime-v2/internalization/owner-decision-review.js +287 -0
  85. package/dist/runtime-v2/internalization/owner-decision-review.js.map +1 -0
  86. package/dist/runtime-v2/internalization/owner-resolution-service.d.ts +11 -0
  87. package/dist/runtime-v2/internalization/owner-resolution-service.d.ts.map +1 -1
  88. package/dist/runtime-v2/internalization/owner-resolution-service.js +117 -4
  89. package/dist/runtime-v2/internalization/owner-resolution-service.js.map +1 -1
  90. package/dist/runtime-v2/internalization/owner-review.d.ts +4 -0
  91. package/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -1
  92. package/dist/runtime-v2/internalization/owner-review.js.map +1 -1
  93. package/dist/runtime-v2/internalization/pitask-metadata.d.ts +16 -0
  94. package/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
  95. package/dist/runtime-v2/internalization/pitask-metadata.js +62 -0
  96. package/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
  97. package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts +13 -0
  98. package/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts.map +1 -1
  99. package/dist/runtime-v2/internalization/rollout-reviewer-runner.js +59 -11
  100. package/dist/runtime-v2/internalization/rollout-reviewer-runner.js.map +1 -1
  101. package/dist/runtime-v2/internalization/rule-activation-contract.d.ts +35 -0
  102. package/dist/runtime-v2/internalization/rule-activation-contract.d.ts.map +1 -0
  103. package/dist/runtime-v2/internalization/rule-activation-contract.js +36 -0
  104. package/dist/runtime-v2/internalization/rule-activation-contract.js.map +1 -0
  105. package/dist/runtime-v2/pain-signal-bridge.d.ts +2 -0
  106. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  107. package/dist/runtime-v2/pain-signal-bridge.js +4 -3
  108. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  109. package/dist/runtime-v2/pain-to-principle-service.d.ts +1 -0
  110. package/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  111. package/dist/runtime-v2/pain-to-principle-service.js +1 -0
  112. package/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  113. package/dist/runtime-v2/runner/__tests__/pain-signal-bridge-admission.test.js +6 -6
  114. package/dist/runtime-v2/runner/__tests__/pain-signal-bridge-admission.test.js.map +1 -1
  115. package/dist/runtime-v2/store/context/sqlite-context-assembler.d.ts.map +1 -1
  116. package/dist/runtime-v2/store/context/sqlite-context-assembler.js +25 -5
  117. package/dist/runtime-v2/store/context/sqlite-context-assembler.js.map +1 -1
  118. package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js +38 -9
  119. package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js.map +1 -1
  120. package/dist/runtime-v2/store/runtime-state-manager.d.ts +6 -0
  121. package/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
  122. package/dist/runtime-v2/store/runtime-state-manager.js +8 -0
  123. package/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
  124. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.js +36 -0
  125. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store-cas.test.js.map +1 -1
  126. package/dist/runtime-v2/store/task/sqlite-task-store.d.ts +19 -0
  127. package/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
  128. package/dist/runtime-v2/store/task/sqlite-task-store.js +30 -1
  129. package/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
  130. package/dist/runtime-v2/task-status.d.ts +2 -1
  131. package/dist/runtime-v2/task-status.d.ts.map +1 -1
  132. package/dist/runtime-v2/task-status.js +5 -1
  133. package/dist/runtime-v2/task-status.js.map +1 -1
  134. package/package.json +1 -1
@@ -0,0 +1,256 @@
1
+ /**
2
+ * PRI-634 R1/R2 — evaluator deterministic gate authority 集成回归。
3
+ *
4
+ * 事故复现(链 48371236):生产装配缺 gateDeps(A1)且 evaluator 输出合法
5
+ * V1 shape 时(A2),`isEvaluatorOutputV2()` 使 adversarial replay 结构性
6
+ * 跳过 → 产出 succeeded + adversarialResult=null → 链上永远没有合法
7
+ * pi-rule-* 产物。
8
+ *
9
+ * R1(authority regression 守卫):code-bearing Artificer artifact + 合法
10
+ * V1-shaped evaluator output(approved)→ **必须**进入 deterministic gate
11
+ * (evaluateInSandbox 被调用),adversarialResult.passed=true 写回产物。
12
+ *
13
+ * R2(wiring regression 守卫):code-bearing + approved 但 gateDeps 未注入
14
+ * → **不得** succeeded + adversarialResult=null;必须 fail-loud
15
+ * (capability_missing,permanent error)。
16
+ *
17
+ * R3(终态不变量守卫):code-bearing + approved 且 gateDeps 已注入时,
18
+ * runAdversarialReplay **必须**产出 adversarialResult;无论何种成因导致
19
+ * gate 没跑成(merged cases 为空 / 无 positive case / 产物不可解析 /
20
+ * conversion drift …),都不得以 succeeded 结束 → fail-loud
21
+ * (input_invalid,permanent)。R1 管「要不要跑」,R3 管「跑了有没有结果」,
22
+ * 二者合一才封死终态;R2 只是 wiring 缺失这一个成因的特例。
23
+ *
24
+ * 另覆盖 A3 可观测性:静默退化路径现在发 adversarial_replay_skipped 事件。
25
+ */
26
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
27
+ import * as fs from 'node:fs';
28
+ import * as path from 'node:path';
29
+ import * as os from 'node:os';
30
+ import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
31
+ import { EvaluatorRunner } from '../evaluator-runner.js';
32
+ import { DefaultEvaluatorValidator } from '../evaluator-output.js';
33
+ import { StoreEventEmitter } from '../../store/event-emitter.js';
34
+ import { SqliteConnection } from '../../store/sqlite-connection.js';
35
+ import { SqlitePIArtifactStore } from '../../store/artifact/sqlite-pi-artifact-store.js';
36
+ import { createPITaskDiagnosticJson } from '../pitask-metadata.js';
37
+ let workspaceDir;
38
+ let stateManager;
39
+ let emitter;
40
+ let emitted;
41
+ const ARTIFICER_ID = 'artificer-gate-auth';
42
+ const EVAL_ID = 'evaluator-gate-auth';
43
+ const ARTIFICER_ART = 'pi-art-artificer-gate-auth';
44
+ beforeEach(async () => {
45
+ workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-gate-auth-'));
46
+ stateManager = new RuntimeStateManager({ workspaceDir });
47
+ await stateManager.initialize();
48
+ emitter = new StoreEventEmitter();
49
+ emitted = [];
50
+ // 所有 telemetry 事件都会 emit('telemetry', event)(event-emitter.ts);
51
+ // 具体 eventType 事件用 onEventType 监听。这里收集全量便于断言。
52
+ emitter.onTelemetry((event) => {
53
+ emitted.push({ eventType: event.eventType, payload: event.payload });
54
+ });
55
+ });
56
+ afterEach(async () => {
57
+ await stateManager.close();
58
+ try {
59
+ fs.rmSync(workspaceDir, { recursive: true, force: true });
60
+ }
61
+ catch { /* temp */ }
62
+ });
63
+ function meta(o = {}) {
64
+ return createPITaskDiagnosticJson({
65
+ dependencyTaskIds: [], channel: 'prompt', timeoutMs: 300_000,
66
+ inputArtifactRefs: [], outputArtifactRefs: [], ...o,
67
+ });
68
+ }
69
+ async function mkTask(id, kind, deps) {
70
+ await stateManager.createTask({ taskId: id, taskKind: kind, status: 'pending', attemptCount: 0, maxAttempts: 3, diagnosticJson: meta({ correlationId: 'gate-auth', dependencyTaskIds: deps }) });
71
+ }
72
+ async function succeed(id) {
73
+ await stateManager.acquireLease({ taskId: id, owner: 'gate-auth', runtimeKind: 'test-double' });
74
+ await stateManager.markTaskSucceeded(id);
75
+ }
76
+ function codeBearingArtificerContent(overrides = {}) {
77
+ return JSON.stringify({
78
+ implementationCode: 'function evaluate(input, helpers) { return { decision: "allow", matched: false }; }',
79
+ goldenTraceCases: [
80
+ { caseId: 'c-neg', kind: 'negative', toolName: 'edit_file', params: { path: '/etc/passwd' }, expectedDecision: 'block' },
81
+ { caseId: 'c-pos', kind: 'positive', toolName: 'edit_file', params: { path: '/project/src/safe.ts' }, expectedDecision: 'allow' },
82
+ ],
83
+ affectedTools: ['edit_file'],
84
+ ...overrides,
85
+ });
86
+ }
87
+ /** 纯 V1 shape:只有评估字段,没有任何 V2 字段(adversarialCases/codeReview/…) */
88
+ function v1EvaluatorOutput(decision) {
89
+ return {
90
+ taskId: EVAL_ID,
91
+ sourceArtificerArtifactId: ARTIFICER_ART,
92
+ evaluation: {
93
+ decision,
94
+ summary: 'gate-auth',
95
+ score: 0.9,
96
+ strengths: [],
97
+ concerns: [],
98
+ requiredChanges: decision === 'needs_revision' ? ['必须改 X'] : [],
99
+ },
100
+ sourceTrace: { artificerArtifactId: ARTIFICER_ART },
101
+ risks: [],
102
+ generatedAt: new Date().toISOString(),
103
+ };
104
+ }
105
+ function scriptedAdapter(payload) {
106
+ return {
107
+ startRun: async () => ({ runId: 'run-gate-auth', runtimeKind: 'test-double', startedAt: new Date().toISOString() }),
108
+ pollRun: async () => ({ status: 'succeeded', runId: 'run-gate-auth' }),
109
+ fetchOutput: async () => ({ runId: 'run-gate-auth', payload }),
110
+ cancelRun: async () => undefined,
111
+ };
112
+ }
113
+ function makeGateDepsStub(calls) {
114
+ return {
115
+ evaluateInSandbox: (_code, _trace) => {
116
+ calls.count += 1;
117
+ return { success: true, failedCases: [], executionTimeMs: 1, forbiddenPatternViolations: [] };
118
+ },
119
+ };
120
+ }
121
+ async function seedLineage(artificerContent) {
122
+ await mkTask(ARTIFICER_ID, 'artificer', []);
123
+ await succeed(ARTIFICER_ID);
124
+ await mkTask(EVAL_ID, 'evaluator', [ARTIFICER_ID]);
125
+ const store = new SqlitePIArtifactStore(new SqliteConnection(workspaceDir));
126
+ await store.upsertArtifact({
127
+ artifactId: ARTIFICER_ART, artifactKind: 'principle', sourceTaskId: ARTIFICER_ID,
128
+ lineageArtifactIds: [], validationStatus: 'validated',
129
+ contentJson: artificerContent,
130
+ createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
131
+ });
132
+ return store;
133
+ }
134
+ function makeRunner(store, options = {}) {
135
+ return new EvaluatorRunner({
136
+ stateManager, runtimeAdapter: scriptedAdapter(options.payload ?? v1EvaluatorOutput('approved')),
137
+ eventEmitter: emitter, artifactStore: store, validator: new DefaultEvaluatorValidator(),
138
+ }, { owner: 'gate-auth', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 5_000, ...options });
139
+ }
140
+ describe('PRI-634 R1: code-bearing + V1-shaped approved output must run the deterministic gate', () => {
141
+ it('evaluateInSandbox 被调用,adversarialResult.passed=true 写回产物,task succeeded', async () => {
142
+ const store = await seedLineage(codeBearingArtificerContent());
143
+ const calls = { count: 0 };
144
+ const runner = makeRunner(store, { gateDeps: makeGateDepsStub(calls) });
145
+ const result = await runner.run(EVAL_ID);
146
+ expect(result.status).toBe('succeeded');
147
+ expect(calls.count).toBeGreaterThan(0); // R1: gate 必须真正运行
148
+ const artifacts = await store.listBySourceTaskId(EVAL_ID);
149
+ const principle = artifacts.find((a) => a.artifactKind === 'principle');
150
+ expect(principle).toBeDefined();
151
+ if (!principle)
152
+ return;
153
+ const parsed = JSON.parse(principle.contentJson);
154
+ expect(parsed.adversarialResult?.passed).toBe(true);
155
+ expect((await stateManager.getTask(EVAL_ID))?.status).toBe('succeeded');
156
+ });
157
+ });
158
+ describe('PRI-634 R2: code-bearing without gateDeps must fail loud, never succeed un-gated', () => {
159
+ it('run 返回 failed(capability_missing),task 落 failed,不产出 succeeded', async () => {
160
+ const store = await seedLineage(codeBearingArtificerContent());
161
+ const runner = makeRunner(store, {}); // 故意不注入 gateDeps
162
+ const result = await runner.run(EVAL_ID);
163
+ expect(result.status).toBe('failed');
164
+ const task = await stateManager.getTask(EVAL_ID);
165
+ expect(task?.status).toBe('failed');
166
+ expect(task?.lastError).toBe('capability_missing');
167
+ // 可观测性:缺 gateDeps 的 skip 事件必须发出(A3)
168
+ expect(emitted.some((e) => e.eventType === 'evaluator_adversarial_replay_skipped' && e.payload.reason === 'gate_deps_not_injected')).toBe(true);
169
+ });
170
+ });
171
+ describe('PRI-634 legacy path: non-code-bearing Artificer keeps V1 behavior', () => {
172
+ it('非 code-bearing(无 implementationCode)+ V1 approved + 无 gateDeps → 走 legacy succeeded(不 fail)', async () => {
173
+ const store = await seedLineage(JSON.stringify({
174
+ analysis: '非 code-bearing artificer 产物(纯分析)',
175
+ goldenTraceCases: [
176
+ { caseId: 'c-neg', kind: 'negative', toolName: 'edit_file', params: { path: '/etc/passwd' }, expectedDecision: 'block' },
177
+ { caseId: 'c-pos', kind: 'positive', toolName: 'edit_file', params: { path: '/project/src/safe.ts' }, expectedDecision: 'allow' },
178
+ ],
179
+ }));
180
+ const runner = makeRunner(store, {});
181
+ const result = await runner.run(EVAL_ID);
182
+ // authority 迁移后 legacy 语义不变:非 code-bearing 不要求 gate,无 gateDeps 也 succeed
183
+ expect(result.status).toBe('succeeded');
184
+ const task = await stateManager.getTask(EVAL_ID);
185
+ expect(task?.status).toBe('succeeded');
186
+ });
187
+ });
188
+ // ── PRI-634 R3(终态不变量)──
189
+ // R1 只保证「code-bearing + approved 会去调 gate」;R3 补上另一半:
190
+ // 「调了但没产出 adversarialResult」同样不允许以 succeeded 结束。二者合一
191
+ // 才真正封死链 48371236 的终态(approved + gate 未执行 +
192
+ // adversarialResult=null + 永无 pi-rule-*)。R2 只覆盖 wiring 缺失这一因,
193
+ // R3 覆盖其余所有成因(cases 为空 / 无 positive case / 产物不可解析 /
194
+ // conversion drift …)—— 封的是终态,不是某个具体成因。
195
+ describe('PRI-634 R3: code-bearing + approved 若 gate 未产出 adversarialResult 必须 fail-loud', () => {
196
+ it('affectedTools 缺失 + positive case 无 path → merged cases 为空 → failed(input_invalid),不得 succeeded', async () => {
197
+ // positive case 保持结构合法(params 允许空对象),但无 path → v2 cases
198
+ // 生成失败(no_path_param_for_v2_adversarial_cases)+ V1 无 LLM cases →
199
+ // merged 为空 → no_adversarial_cases_after_merge。
200
+ //
201
+ // 这正是 Owner 复核指出的逃逸路径:旧断言 succeeded 与文件顶部 R1 契约
202
+ // (「必须进入 deterministic gate」)自相矛盾,等于给洞发通行证。
203
+ const store = await seedLineage(codeBearingArtificerContent({
204
+ affectedTools: undefined,
205
+ goldenTraceCases: [
206
+ { caseId: 'c-neg', kind: 'negative', toolName: 'edit_file', params: { path: '/etc/passwd' }, expectedDecision: 'block' },
207
+ { caseId: 'c-pos', kind: 'positive', toolName: 'edit_file', params: {}, expectedDecision: 'allow' },
208
+ ],
209
+ }));
210
+ const calls = { count: 0 };
211
+ const runner = makeRunner(store, { gateDeps: makeGateDepsStub(calls) });
212
+ const result = await runner.run(EVAL_ID);
213
+ // 终态守卫:gate 没跑成 → 必须 fail-loud,而不是 succeeded + null
214
+ expect(result.status).toBe('failed');
215
+ expect(calls.count).toBe(0);
216
+ // permanent(input_invalid 已在 permanentErrorCategories),不重试烧 LLM budget;
217
+ // 与 R2 的 capability_missing 区分:gate 已正确装配,是上游产物派生不出 gate 输入
218
+ const task = await stateManager.getTask(EVAL_ID);
219
+ expect(task?.status).toBe('failed');
220
+ expect(task?.lastError).toBe('input_invalid');
221
+ // A3 可观测性保留:skip 事件仍要发
222
+ expect(emitted.some((e) => e.eventType === 'evaluator_adversarial_replay_skipped' && e.payload.reason === 'no_adversarial_cases_after_merge')).toBe(true);
223
+ });
224
+ it('反向对照:非 code-bearing(无 implementationCode)+ V2 output → 同样 skip,但走 legacy succeeded(R3 不误伤)', async () => {
225
+ // A2 明确保留的 legacy 语义:V2-shaped output over a non-code-bearing
226
+ // artifact 仍尝试 replay,失败则带 telemetry 降级,不升级为失败。
227
+ // 若此例也 failed,说明 R3 的作用域收窄错了。
228
+ const store = await seedLineage(JSON.stringify({
229
+ analysis: '非 code-bearing artificer 产物(纯分析)',
230
+ goldenTraceCases: [
231
+ { caseId: 'c-neg', kind: 'negative', toolName: 'edit_file', params: { path: '/etc/passwd' }, expectedDecision: 'block' },
232
+ { caseId: 'c-pos', kind: 'positive', toolName: 'edit_file', params: { path: '/project/src/safe.ts' }, expectedDecision: 'allow' },
233
+ ],
234
+ }));
235
+ const calls = { count: 0 };
236
+ // V2-shaped output:带合法 codeReview,无 adversarialCases →
237
+ // outputWantsGate=true 会进入 replay,但因缺 implementationCode 而 skip
238
+ const runner = makeRunner(store, {
239
+ gateDeps: makeGateDepsStub(calls),
240
+ payload: {
241
+ ...v1EvaluatorOutput('approved'),
242
+ codeReview: {
243
+ intentConsistency: { aligned: true, explanation: '与原则意图一致' },
244
+ scopePrecision: { verdict: 'precise', explanation: '范围精确' },
245
+ traceCoverage: { sufficient: true, gaps: [], explanation: '覆盖充分' },
246
+ summary: 'code review passed',
247
+ },
248
+ },
249
+ });
250
+ const result = await runner.run(EVAL_ID);
251
+ expect(result.status).toBe('succeeded');
252
+ expect(calls.count).toBe(0);
253
+ expect(emitted.some((e) => e.eventType === 'evaluator_adversarial_replay_skipped' && e.payload.reason === 'artificer_artifact_has_no_implementation_code')).toBe(true);
254
+ });
255
+ });
256
+ //# sourceMappingURL=evaluator-gate-authority.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator-gate-authority.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/evaluator-gate-authority.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=owner-decision-review.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-decision-review.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/owner-decision-review.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,229 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createPITaskDiagnosticJson } from '../pitask-metadata.js';
3
+ import { HUMAN_REVIEW_REASON } from '../owner-review.js';
4
+ import { buildOwnerDecisionReview, } from '../owner-decision-review.js';
5
+ const EVALUATOR_ID = 'evaluator-review-1';
6
+ const ARTIFICER_TASK_ID = 'artificer-review-1';
7
+ const SCRIBE_TASK_ID = 'scribe-review-1';
8
+ const EVALUATOR_ARTIFACT_ID = 'pi-art-evaluator-review-1-run-1';
9
+ const ARTIFICER_ARTIFACT_ID = 'pi-art-artificer-review-1-run-1';
10
+ const SCRIBE_ARTIFACT_ID = 'pi-art-scribe-review-1-run-1';
11
+ function metadata(taskKind) {
12
+ const dependencyTaskIds = taskKind === 'evaluator'
13
+ ? [ARTIFICER_TASK_ID]
14
+ : taskKind === 'artificer' ? [SCRIBE_TASK_ID] : [];
15
+ return {
16
+ dependencyTaskIds,
17
+ channel: 'code_tool_hook',
18
+ timeoutMs: 300_000,
19
+ inputArtifactRefs: [],
20
+ outputArtifactRefs: [],
21
+ ...(taskKind === 'evaluator'
22
+ ? {
23
+ runnerDecision: 'needs_revision',
24
+ revisionCount: 0,
25
+ completionIntent: {
26
+ decision: 'needs_revision',
27
+ sourceRunId: 'run-1',
28
+ revisionEpoch: 0,
29
+ status: 'pending',
30
+ },
31
+ humanReviewContext: {
32
+ reasonCode: HUMAN_REVIEW_REASON.evaluatorRepairBudgetExhausted,
33
+ sourceRunId: 'run-1',
34
+ sourceArtifactId: EVALUATOR_ARTIFACT_ID,
35
+ revisionEpoch: 0,
36
+ createdAt: '2026-08-31T00:00:00.000Z',
37
+ },
38
+ }
39
+ : {}),
40
+ };
41
+ }
42
+ function task(taskId, taskKind) {
43
+ return {
44
+ taskId,
45
+ taskKind,
46
+ status: taskKind === 'evaluator' ? 'needs_human_review' : 'succeeded',
47
+ attemptCount: 1,
48
+ maxAttempts: 3,
49
+ createdAt: '2026-08-31T00:00:00.000Z',
50
+ updatedAt: '2026-08-31T00:05:00.000Z',
51
+ diagnosticJson: createPITaskDiagnosticJson(metadata(taskKind)),
52
+ };
53
+ }
54
+ function artifact(input) {
55
+ return {
56
+ artifactId: input.artifactId,
57
+ artifactKind: 'principle',
58
+ sourceTaskId: input.sourceTaskId,
59
+ lineageArtifactIds: input.lineageArtifactIds,
60
+ validationStatus: 'pending',
61
+ contentJson: JSON.stringify(input.content),
62
+ createdAt: '2026-08-31T00:00:00.000Z',
63
+ };
64
+ }
65
+ function makeStore(options = {}) {
66
+ const oldArtificerArtifactId = 'pi-art-artificer-review-old-run-1';
67
+ const oldScribeArtifactId = 'pi-art-scribe-review-old-run-1';
68
+ const records = [
69
+ ...(options.includeOlderRepair ? [
70
+ artifact({ artifactId: oldScribeArtifactId, sourceTaskId: 'scribe-review-old', lineageArtifactIds: [], content: {
71
+ principleDraft: { statement: 'OLD principle must not be shown.' },
72
+ } }),
73
+ artifact({ artifactId: oldArtificerArtifactId, sourceTaskId: 'artificer-review-old', lineageArtifactIds: [oldScribeArtifactId], content: {
74
+ sourceScribeArtifactId: oldScribeArtifactId,
75
+ sourceTrace: { scribeArtifactId: oldScribeArtifactId },
76
+ implementationSummary: 'OLD implementation must not be shown.',
77
+ } }),
78
+ ] : []),
79
+ artifact({ artifactId: SCRIBE_ARTIFACT_ID, sourceTaskId: SCRIBE_TASK_ID, lineageArtifactIds: [], content: {
80
+ principleDraft: {
81
+ title: 'Confirm destructive changes',
82
+ statement: 'Before destructive changes, confirm the exact target with the Owner.',
83
+ rationale: 'Prevents irreversible work against an ambiguous target.',
84
+ applicability: ['filesystem writes'],
85
+ antiPatterns: ['guessing the target'],
86
+ },
87
+ } }),
88
+ artifact({ artifactId: ARTIFICER_ARTIFACT_ID, sourceTaskId: ARTIFICER_TASK_ID, lineageArtifactIds: [SCRIBE_ARTIFACT_ID], content: {
89
+ ...(options.codeBearingArtificer
90
+ ? {
91
+ taskId: ARTIFICER_TASK_ID,
92
+ implementationCode: 'export function confirmTarget() { return true; }',
93
+ goldenTraceCases: [
94
+ {
95
+ caseId: 'allows-confirmed-target',
96
+ kind: 'positive',
97
+ toolName: 'write_file',
98
+ params: { confirmed: true },
99
+ expectedDecision: 'allow',
100
+ },
101
+ {
102
+ caseId: 'blocks-unconfirmed-target',
103
+ kind: 'negative',
104
+ toolName: 'write_file',
105
+ params: { confirmed: false },
106
+ expectedDecision: 'block',
107
+ },
108
+ ],
109
+ generatedAt: '2026-08-31T00:00:00.000Z',
110
+ }
111
+ : {}),
112
+ sourceScribeArtifactId: SCRIBE_ARTIFACT_ID,
113
+ sourceTrace: { scribeArtifactId: SCRIBE_ARTIFACT_ID },
114
+ implementationSummary: 'Adds a confirmation gate before destructive writes.',
115
+ affectedTools: ['write_file', 'apply_patch'],
116
+ risks: ['May add one interaction before a destructive action.'],
117
+ ...options.artificerExtra,
118
+ } }),
119
+ artifact({ artifactId: EVALUATOR_ARTIFACT_ID, sourceTaskId: EVALUATOR_ID, lineageArtifactIds: [
120
+ ...(options.includeOlderRepair ? [oldArtificerArtifactId] : []),
121
+ ARTIFICER_ARTIFACT_ID,
122
+ ], content: {
123
+ sourceArtificerArtifactId: ARTIFICER_ARTIFACT_ID,
124
+ sourceTrace: { artificerArtifactId: ARTIFICER_ARTIFACT_ID },
125
+ evaluation: {
126
+ decision: 'needs_revision',
127
+ score: 0.72,
128
+ strengths: ['The target check is deterministic.'],
129
+ concerns: [options.concern ?? 'The confirmation copy is ambiguous.'],
130
+ requiredChanges: ['Clarify the confirmation copy.'],
131
+ },
132
+ ...(options.adversarialPassed === undefined
133
+ ? {}
134
+ : { adversarialResult: { passed: options.adversarialPassed, failedCases: [] } }),
135
+ ...options.evaluatorExtra,
136
+ } }),
137
+ ].filter((record) => options.includeScribe !== false || record.artifactId !== SCRIBE_ARTIFACT_ID);
138
+ const tasks = [
139
+ task(EVALUATOR_ID, 'evaluator'),
140
+ ...(options.includeOlderRepair ? [
141
+ task('artificer-review-old', 'artificer'),
142
+ task('scribe-review-old', 'scribe'),
143
+ ] : []),
144
+ task(ARTIFICER_TASK_ID, 'artificer'),
145
+ ...(options.includeScribe === false ? [] : [task(SCRIBE_TASK_ID, 'scribe')]),
146
+ ];
147
+ return {
148
+ getTask: async (id) => tasks.find((entry) => entry.taskId === id) ?? null,
149
+ listArtifactsBySourceTask: async (id) => records.filter((entry) => entry.sourceTaskId === id),
150
+ getArtifactById: async (id) => records.find((entry) => entry.artifactId === id) ?? null,
151
+ };
152
+ }
153
+ describe('Owner Decision Review Snapshot', () => {
154
+ it('builds a distinct evidence-rich evaluator brief and reports an absent adversarial result as not_run', async () => {
155
+ const snapshot = await buildOwnerDecisionReview(makeStore(), EVALUATOR_ID);
156
+ expect(snapshot?.brief.kind).toBe('evaluator');
157
+ if (snapshot?.brief.kind !== 'evaluator')
158
+ throw new Error('expected evaluator brief');
159
+ expect(snapshot.brief.principle.statement).toContain('confirm the exact target');
160
+ expect(snapshot.brief.implementation.summary).toContain('confirmation gate');
161
+ expect(snapshot.brief.implementation.affectedTools).toEqual(['write_file', 'apply_patch']);
162
+ expect(snapshot.brief.concerns).toEqual(['The confirmation copy is ambiguous.']);
163
+ expect(snapshot.evidence.deterministicChecks).toEqual([
164
+ { check: 'adversarial_hard_gate', status: 'not_run' },
165
+ ]);
166
+ expect(snapshot.evidence.completeness).toBe('complete');
167
+ });
168
+ it('requires acknowledgement for a partial but still identifiable review', async () => {
169
+ const snapshot = await buildOwnerDecisionReview(makeStore({ includeScribe: false }), EVALUATOR_ID);
170
+ expect(snapshot?.evidence.completeness).toBe('partial');
171
+ expect(snapshot?.capability.acceptRequirement).toEqual({
172
+ kind: 'acknowledge_partial_evidence',
173
+ });
174
+ expect(snapshot?.capability.finalOfferedActions).toContain('accept_current');
175
+ });
176
+ it('forbids accept when the deterministic adversarial hard gate explicitly failed', async () => {
177
+ const snapshot = await buildOwnerDecisionReview(makeStore({ adversarialPassed: false }), EVALUATOR_ID);
178
+ expect(snapshot?.evidence.deterministicChecks).toEqual([
179
+ { check: 'adversarial_hard_gate', status: 'failed' },
180
+ ]);
181
+ expect(snapshot?.capability.finalOfferedActions).not.toContain('accept_current');
182
+ expect(snapshot?.capability.acceptRequirement).toEqual({
183
+ kind: 'forbidden',
184
+ reasonCode: 'adversarial_hard_gate_failed',
185
+ });
186
+ });
187
+ it('forbids accept when a validated code-bearing Artificer output has not passed the hard gate', async () => {
188
+ const snapshot = await buildOwnerDecisionReview(makeStore({ codeBearingArtificer: true }), EVALUATOR_ID);
189
+ expect(snapshot?.evidence.deterministicChecks[0]?.status).toBe('not_run');
190
+ expect(snapshot?.capability.finalOfferedActions).not.toContain('accept_current');
191
+ expect(snapshot?.capability.acceptRequirement).toEqual({
192
+ kind: 'forbidden',
193
+ reasonCode: 'adversarial_hard_gate_not_passed',
194
+ });
195
+ });
196
+ it('uses the canonical code-bearing assessment when affectedTools is omitted', async () => {
197
+ const snapshot = await buildOwnerDecisionReview(makeStore({
198
+ codeBearingArtificer: true,
199
+ artificerExtra: { affectedTools: undefined },
200
+ }), EVALUATOR_ID);
201
+ expect(snapshot?.evidence.deterministicChecks[0]?.status).toBe('not_run');
202
+ expect(snapshot?.capability.finalOfferedActions).not.toContain('accept_current');
203
+ expect(snapshot?.capability.acceptRequirement).toEqual({
204
+ kind: 'forbidden',
205
+ reasonCode: 'adversarial_hard_gate_not_passed',
206
+ });
207
+ });
208
+ it('keeps legacy compatibility when the Artificer artifact is not a validated code-bearing output', async () => {
209
+ const snapshot = await buildOwnerDecisionReview(makeStore(), EVALUATOR_ID);
210
+ expect(snapshot?.capability.finalOfferedActions).toContain('accept_current');
211
+ });
212
+ it('uses the evaluator-declared repair lineage instead of the first reachable artificer', async () => {
213
+ const snapshot = await buildOwnerDecisionReview(makeStore({ includeOlderRepair: true }), EVALUATOR_ID);
214
+ expect(snapshot?.brief.kind).toBe('evaluator');
215
+ if (snapshot?.brief.kind !== 'evaluator')
216
+ throw new Error('expected evaluator brief');
217
+ expect(snapshot.brief.principle.statement).toContain('confirm the exact target');
218
+ expect(snapshot.brief.implementation.summary).toContain('confirmation gate');
219
+ expect(snapshot.evidence.manifest.sources.map((source) => source.stableId))
220
+ .not.toContain('pi-art-artificer-review-old-run-1');
221
+ });
222
+ it('changes the evidence digest when visible decision semantics change', async () => {
223
+ const first = await buildOwnerDecisionReview(makeStore({ concern: 'Concern A' }), EVALUATOR_ID);
224
+ const second = await buildOwnerDecisionReview(makeStore({ concern: 'Concern B' }), EVALUATOR_ID);
225
+ expect(first?.evidence.digest).toMatch(/^[a-f0-9]{64}$/);
226
+ expect(second?.evidence.digest).not.toBe(first?.evidence.digest);
227
+ });
228
+ });
229
+ //# sourceMappingURL=owner-decision-review.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-decision-review.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/owner-decision-review.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,0BAA0B,EAAuB,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACL,wBAAwB,GAEzB,MAAM,6BAA6B,CAAC;AAErC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAC1C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAC/C,MAAM,cAAc,GAAG,iBAAiB,CAAC;AACzC,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;AAChE,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;AAChE,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAE1D,SAAS,QAAQ,CAAC,QAA8C;IAC9D,MAAM,iBAAiB,GAAG,QAAQ,KAAK,WAAW;QAChD,CAAC,CAAC,CAAC,iBAAiB,CAAC;QACrB,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,OAAO;QACL,iBAAiB;QACjB,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,OAAO;QAClB,iBAAiB,EAAE,EAAE;QACrB,kBAAkB,EAAE,EAAE;QACtB,GAAG,CAAC,QAAQ,KAAK,WAAW;YAC1B,CAAC,CAAC;gBACE,cAAc,EAAE,gBAAyB;gBACzC,aAAa,EAAE,CAAC;gBAChB,gBAAgB,EAAE;oBAChB,QAAQ,EAAE,gBAAyB;oBACnC,WAAW,EAAE,OAAO;oBACpB,aAAa,EAAE,CAAC;oBAChB,MAAM,EAAE,SAAkB;iBAC3B;gBACD,kBAAkB,EAAE;oBAClB,UAAU,EAAE,mBAAmB,CAAC,8BAA8B;oBAC9D,WAAW,EAAE,OAAO;oBACpB,gBAAgB,EAAE,qBAAqB;oBACvC,aAAa,EAAE,CAAC;oBAChB,SAAS,EAAE,0BAA0B;iBACtC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,MAAc,EAAE,QAA8C;IAC1E,OAAO;QACL,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW;QACrE,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,0BAA0B;QACrC,SAAS,EAAE,0BAA0B;QACrC,cAAc,EAAE,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAKjB;IACC,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,WAAW;QACzB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,gBAAgB,EAAE,SAAS;QAC3B,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,SAAS,EAAE,0BAA0B;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAO,GAQtB,EAAE;IACJ,MAAM,sBAAsB,GAAG,mCAAmC,CAAC;IACnE,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;IAC7D,MAAM,OAAO,GAAG;QACd,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC/B,QAAQ,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE;oBAC9G,cAAc,EAAE,EAAE,SAAS,EAAE,kCAAkC,EAAE;iBAClE,EAAC,CAAC;YACH,QAAQ,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE;oBACvI,sBAAsB,EAAE,mBAAmB;oBAC3C,WAAW,EAAE,EAAE,gBAAgB,EAAE,mBAAmB,EAAE;oBACtD,qBAAqB,EAAE,uCAAuC;iBAC/D,EAAC,CAAC;SACJ,CAAC,CAAC,CAAC,EAAE,CAAC;QACP,QAAQ,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE;gBACxG,cAAc,EAAE;oBACd,KAAK,EAAE,6BAA6B;oBACpC,SAAS,EAAE,sEAAsE;oBACjF,SAAS,EAAE,yDAAyD;oBACpE,aAAa,EAAE,CAAC,mBAAmB,CAAC;oBACpC,YAAY,EAAE,CAAC,qBAAqB,CAAC;iBACtC;aACF,EAAC,CAAC;QACH,QAAQ,CAAC,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE;gBAChI,GAAG,CAAC,OAAO,CAAC,oBAAoB;oBAC9B,CAAC,CAAC;wBACE,MAAM,EAAE,iBAAiB;wBACzB,kBAAkB,EAAE,kDAAkD;wBACtE,gBAAgB,EAAE;4BAChB;gCACE,MAAM,EAAE,yBAAyB;gCACjC,IAAI,EAAE,UAAU;gCAChB,QAAQ,EAAE,YAAY;gCACtB,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;gCAC3B,gBAAgB,EAAE,OAAO;6BAC1B;4BACD;gCACE,MAAM,EAAE,2BAA2B;gCACnC,IAAI,EAAE,UAAU;gCAChB,QAAQ,EAAE,YAAY;gCACtB,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;gCAC5B,gBAAgB,EAAE,OAAO;6BAC1B;yBACF;wBACD,WAAW,EAAE,0BAA0B;qBACxC;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,sBAAsB,EAAE,kBAAkB;gBAC1C,WAAW,EAAE,EAAE,gBAAgB,EAAE,kBAAkB,EAAE;gBACrD,qBAAqB,EAAE,qDAAqD;gBAC5E,aAAa,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;gBAC5C,KAAK,EAAE,CAAC,sDAAsD,CAAC;gBAC/D,GAAG,OAAO,CAAC,cAAc;aAC1B,EAAC,CAAC;QACH,QAAQ,CAAC,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE;gBAC5F,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,qBAAqB;aACtB,EAAE,OAAO,EAAE;gBACV,yBAAyB,EAAE,qBAAqB;gBAChD,WAAW,EAAE,EAAE,mBAAmB,EAAE,qBAAqB,EAAE;gBAC3D,UAAU,EAAE;oBACV,QAAQ,EAAE,gBAAgB;oBAC1B,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE,CAAC,oCAAoC,CAAC;oBACjD,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,qCAAqC,CAAC;oBACpE,eAAe,EAAE,CAAC,gCAAgC,CAAC;iBACpD;gBACD,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;oBACzC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC;gBAClF,GAAG,OAAO,CAAC,cAAc;aAC1B,EAAC,CAAC;KACJ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;QAC/B,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC;YACzC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;KAC7E,CAAC;IACF,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,IAAI,IAAI;QACzE,yBAAyB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC;QAC7F,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,IAAI;KACxF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACnH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;QAE3E,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC7E,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC;YACpD,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,SAAS,EAAE;SACtD,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAC7C,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EACnC,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YACrD,IAAI,EAAE,8BAA8B;SACrC,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAC7C,SAAS,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EACvC,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC;YACrD,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE;SACrD,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YACrD,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,8BAA8B;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAC7C,SAAS,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EACzC,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YACrD,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,kCAAkC;SAC/C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAC7C,SAAS,CAAC;YACR,oBAAoB,EAAE,IAAI;YAC1B,cAAc,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE;SAC7C,CAAC,EACF,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;YACrD,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,kCAAkC;SAC/C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;QAC3E,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAC7C,SAAS,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EACvC,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC7E,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aACxE,GAAG,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAC1C,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EACnC,YAAY,CACb,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAC3C,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EACnC,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}