devcontour-harness 0.1.0-alpha.13 → 0.1.0-alpha.18

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 (73) hide show
  1. package/README.md +48 -2
  2. package/docs/architecture.md +77 -3
  3. package/docs/contracts.md +100 -0
  4. package/docs/quickstart.md +1 -1
  5. package/docs/release-notes/0.1.0-alpha.14.md +69 -0
  6. package/docs/release-notes/0.1.0-alpha.15.md +62 -0
  7. package/docs/release-notes/0.1.0-alpha.16.md +36 -0
  8. package/docs/release-notes/0.1.0-alpha.17.md +86 -0
  9. package/docs/release-notes/0.1.0-alpha.18.md +48 -0
  10. package/docs/review-probes.md +9 -3
  11. package/docs/review-protocol.md +9 -0
  12. package/docs/upgrade.md +16 -14
  13. package/lib/agents/cli-adapter.js +14 -10
  14. package/lib/agents/review-probe.d.ts +9 -0
  15. package/lib/agents/review-probe.js +23 -1
  16. package/lib/agents/schemas.d.ts +206 -0
  17. package/lib/agents/schemas.js +37 -1
  18. package/lib/agents/usage.d.ts +22 -0
  19. package/lib/agents/usage.js +112 -6
  20. package/lib/contracts/checks.d.ts +119 -0
  21. package/lib/contracts/checks.js +64 -1
  22. package/lib/contracts/cli.d.ts +30 -0
  23. package/lib/contracts/diagnosis.d.ts +3 -1
  24. package/lib/contracts/diagnosis.js +2 -0
  25. package/lib/contracts/events.d.ts +12 -0
  26. package/lib/contracts/execution.d.ts +109 -5
  27. package/lib/contracts/execution.js +58 -0
  28. package/lib/contracts/failure.d.ts +17 -3
  29. package/lib/contracts/failure.js +4 -2
  30. package/lib/contracts/published.d.ts +67 -1
  31. package/lib/contracts/repair-policy.d.ts +7 -0
  32. package/lib/contracts/repair-policy.js +17 -0
  33. package/lib/contracts/review.d.ts +12 -0
  34. package/lib/contracts/review.js +19 -0
  35. package/lib/control/harness.d.ts +2 -2
  36. package/lib/control/harness.js +2 -1
  37. package/lib/control/recovery.d.ts +26 -1
  38. package/lib/engine/engine.d.ts +41 -14
  39. package/lib/engine/engine.js +92 -8
  40. package/lib/engine/failure.d.ts +1 -1
  41. package/lib/engine/failure.js +1 -1
  42. package/lib/engine/property-recovery.d.ts +1 -0
  43. package/lib/engine/property-recovery.js +4 -1
  44. package/lib/engine/repair.d.ts +26 -0
  45. package/lib/engine/repair.js +83 -1
  46. package/lib/engine/runner.d.ts +7 -0
  47. package/lib/engine/runner.js +207 -34
  48. package/lib/explain/state.js +4 -2
  49. package/lib/index.d.ts +6 -4
  50. package/lib/index.js +6 -4
  51. package/lib/projections/stop.d.ts +1 -1
  52. package/lib/projections/stop.js +16 -0
  53. package/lib/storage/document.d.ts +48 -8
  54. package/lib/verification/acceptance.js +2 -1
  55. package/lib/verification/already-satisfied.d.ts +44 -0
  56. package/lib/verification/already-satisfied.js +49 -0
  57. package/lib/verification/checks.d.ts +28 -0
  58. package/lib/verification/checks.js +270 -22
  59. package/lib/verification/corpus.d.ts +50 -0
  60. package/lib/verification/gate-scope.d.ts +36 -0
  61. package/lib/verification/gate-scope.js +97 -0
  62. package/lib/verification/gates-at.d.ts +67 -0
  63. package/lib/verification/gates-at.js +173 -0
  64. package/lib/verification/gates.d.ts +5 -0
  65. package/lib/verification/gates.js +20 -5
  66. package/lib/verification/property.d.ts +9 -0
  67. package/lib/verification/property.js +11 -2
  68. package/lib/verification/self-check.js +12 -12
  69. package/package.json +1 -1
  70. package/schemas/contract-document.schema.json +161 -0
  71. package/schemas/execution-document.schema.json +134 -0
  72. package/schemas/run-event.schema.json +4 -0
  73. package/schemas/stop-diagnosis.schema.json +2 -0
@@ -69,15 +69,121 @@ export function runtimeVersion(executable, env) {
69
69
  .catch(() => null));
70
70
  return versions.get(key);
71
71
  }
72
+ /** Модель события runtime: событие system у claude, ключи modelUsage у codex. */
73
+ function eventModel(event) {
74
+ if (typeof event.model === 'string' && event.model && event.model !== '<synthetic>')
75
+ return event.model;
76
+ const usage = event.modelUsage;
77
+ const [name] = Object.keys(usage ?? {});
78
+ return name ?? null;
79
+ }
72
80
  /** Модель, которую runtime выбрал на самом деле: событие system у claude, ключи modelUsage у codex. */
73
81
  export function reportedModel(stdout) {
74
82
  for (const event of runtimeEvents(stdout).events) {
75
- if (typeof event.model === 'string' && event.model && event.model !== '<synthetic>')
76
- return event.model;
77
- const usage = event.modelUsage;
78
- const [name] = Object.keys(usage ?? {});
79
- if (name)
80
- return name;
83
+ const model = eventModel(event);
84
+ if (model)
85
+ return model;
81
86
  }
82
87
  return null;
83
88
  }
89
+ /** Строка потока длиннее — не разбирается и делает телеметрию неполной. */
90
+ export const LINE_LIMIT = 8_000_000;
91
+ /**
92
+ * Только числовые поля верхнего уровня `usage`: вложенная структура любой
93
+ * глубины не хранится и не сериализуется (глубокая вложенность роняла бы
94
+ * `JSON.stringify` в обработчике вывода процесса).
95
+ */
96
+ const flatUsage = (usage) => usage && typeof usage === 'object' && !Array.isArray(usage)
97
+ ? Object.fromEntries(Object.entries(usage).filter(([, v]) => typeof v === 'number' || v === null))
98
+ : usage === undefined
99
+ ? undefined
100
+ : {};
101
+ /**
102
+ * Телеметрия, собранная по ходу потока runtime, а не из хвоста вывода. Хвост
103
+ * stdout и журнал вызова ограничены, и у долгого вызова итоговое событие
104
+ * `result` (стоимость и счётчики claude) или ранние `turn.completed` codex
105
+ * оказывались за пределом: стоимость, сообщённая провайдером, терялась или
106
+ * учитывалась неполной. Здесь каждая строка разбирается сразу; хранятся
107
+ * только поля телеметрии — последнее событие `result`, события
108
+ * `turn.completed` и первая сообщённая модель, — а не текст вывода.
109
+ */
110
+ export function usageStream(runtime) {
111
+ let partial = '', overflow = false, malformed = false, model = null, result;
112
+ const turns = [];
113
+ const line = (text) => {
114
+ if (!text.trim())
115
+ return;
116
+ let event;
117
+ try {
118
+ event = JSON.parse(text);
119
+ }
120
+ catch {
121
+ malformed = true;
122
+ return;
123
+ }
124
+ if (!event || typeof event !== 'object' || Array.isArray(event)) {
125
+ malformed = true;
126
+ return;
127
+ }
128
+ const e = event;
129
+ model ??= eventModel(e);
130
+ if (runtime === 'claude' && e.type === 'result')
131
+ result = JSON.stringify({
132
+ type: e.type,
133
+ usage: flatUsage(e.usage),
134
+ total_cost_usd: typeof e.total_cost_usd === 'number' ? e.total_cost_usd : null,
135
+ });
136
+ if (runtime === 'codex' && e.type === 'turn.completed')
137
+ turns.push(JSON.stringify({ type: e.type, usage: flatUsage(e.usage) }));
138
+ };
139
+ const flush = () => {
140
+ if (overflow)
141
+ malformed = true;
142
+ else
143
+ line(partial);
144
+ partial = '';
145
+ overflow = false;
146
+ };
147
+ const append = (piece) => {
148
+ if (overflow)
149
+ return;
150
+ if (partial.length + piece.length > LINE_LIMIT) {
151
+ partial = '';
152
+ overflow = true;
153
+ }
154
+ else
155
+ partial += piece;
156
+ };
157
+ const consume = (text) => {
158
+ let start = 0;
159
+ for (let end = text.indexOf('\n'); end >= 0; end = text.indexOf('\n', start)) {
160
+ append(text.slice(start, end));
161
+ flush();
162
+ start = end + 1;
163
+ }
164
+ append(text.slice(start));
165
+ };
166
+ return {
167
+ /**
168
+ * Очередной фрагмент stdout runtime (без маски: берутся только числа).
169
+ * Вызывается из обработчика вывода процесса и не бросает: сбой разбора —
170
+ * неполная телеметрия, а не падение controller.
171
+ */
172
+ push(text) {
173
+ try {
174
+ consume(text);
175
+ }
176
+ catch {
177
+ malformed = true;
178
+ partial = '';
179
+ overflow = true;
180
+ }
181
+ },
182
+ /** Телеметрия всего потока; `completed` — вызов завершился штатно. */
183
+ usage(completed) {
184
+ flush();
185
+ return parseUsage(runtime, [...turns, ...(result ? [result] : [])].join('\n'), completed && !malformed);
186
+ },
187
+ model: () => model,
188
+ };
189
+ }
@@ -2,6 +2,41 @@ import { z } from 'zod';
2
2
  export declare const promiseKinds: readonly ["functional", "accuracy", "optimality", "completeness", "performance", "invariant", "other"];
3
3
  /** Вычислительные обещания: без независимого способа проверки их не утверждают. */
4
4
  export declare const strongPromises: ReadonlySet<string>;
5
+ /**
6
+ * Проверка по закреплённым эталонным наборам (`verification: 'reference'`).
7
+ *
8
+ * Ответы независимого эталона (решатель, полный перебор, таблица DP)
9
+ * получены заранее, сверены с другим способом на семействах входов и
10
+ * закреплены артефактами контракта. Gate сверяет реализацию с наборами и
11
+ * отчитывается тем же отчётом свойств: число проверенных входов по свойству
12
+ * и по семействам. Каждый набор принадлежит одному gate: его минимум и
13
+ * минимумы семейств — доля этого gate в покрытии обязательства. Обобщения за
14
+ * пределы наборов такой способ не доказывает — это называет `gaps`.
15
+ */
16
+ export declare const referenceSchema: z.ZodObject<{
17
+ oracle: z.ZodObject<{
18
+ description: z.ZodString;
19
+ limits: z.ZodString;
20
+ }, z.core.$strict>;
21
+ crossChecks: z.ZodArray<z.ZodObject<{
22
+ family: z.ZodString;
23
+ against: z.ZodString;
24
+ matches: z.ZodNumber;
25
+ total: z.ZodNumber;
26
+ artifacts: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ }, z.core.$strict>>;
28
+ sets: z.ZodArray<z.ZodObject<{
29
+ gate: z.ZodString;
30
+ artifacts: z.ZodArray<z.ZodString>;
31
+ minCases: z.ZodNumber;
32
+ families: z.ZodDefault<z.ZodArray<z.ZodObject<{
33
+ id: z.ZodString;
34
+ minCases: z.ZodNumber;
35
+ }, z.core.$strict>>>;
36
+ }, z.core.$strict>>;
37
+ gaps: z.ZodString;
38
+ }, z.core.$strict>;
39
+ export type ReferenceVerification = z.infer<typeof referenceSchema>;
5
40
  export declare const obligationSchema: z.ZodObject<{
6
41
  property: z.ZodString;
7
42
  requirements: z.ZodArray<z.ZodString>;
@@ -63,6 +98,34 @@ export declare const obligationSchema: z.ZodObject<{
63
98
  environment: z.ZodString;
64
99
  }, z.core.$strict>>;
65
100
  }, z.core.$strict>;
101
+ gates: z.ZodOptional<z.ZodArray<z.ZodString>>;
102
+ verification: z.ZodOptional<z.ZodEnum<{
103
+ property: "property";
104
+ reference: "reference";
105
+ }>>;
106
+ reference: z.ZodOptional<z.ZodObject<{
107
+ oracle: z.ZodObject<{
108
+ description: z.ZodString;
109
+ limits: z.ZodString;
110
+ }, z.core.$strict>;
111
+ crossChecks: z.ZodArray<z.ZodObject<{
112
+ family: z.ZodString;
113
+ against: z.ZodString;
114
+ matches: z.ZodNumber;
115
+ total: z.ZodNumber;
116
+ artifacts: z.ZodOptional<z.ZodArray<z.ZodString>>;
117
+ }, z.core.$strict>>;
118
+ sets: z.ZodArray<z.ZodObject<{
119
+ gate: z.ZodString;
120
+ artifacts: z.ZodArray<z.ZodString>;
121
+ minCases: z.ZodNumber;
122
+ families: z.ZodDefault<z.ZodArray<z.ZodObject<{
123
+ id: z.ZodString;
124
+ minCases: z.ZodNumber;
125
+ }, z.core.$strict>>>;
126
+ }, z.core.$strict>>;
127
+ gaps: z.ZodString;
128
+ }, z.core.$strict>>;
66
129
  hard: z.ZodDefault<z.ZodBoolean>;
67
130
  feasibility: z.ZodOptional<z.ZodObject<{
68
131
  spike: z.ZodString;
@@ -134,6 +197,34 @@ export declare const checkDeclarationSchema: z.ZodObject<{
134
197
  environment: z.ZodString;
135
198
  }, z.core.$strict>>;
136
199
  }, z.core.$strict>;
200
+ gates: z.ZodOptional<z.ZodArray<z.ZodString>>;
201
+ verification: z.ZodOptional<z.ZodEnum<{
202
+ property: "property";
203
+ reference: "reference";
204
+ }>>;
205
+ reference: z.ZodOptional<z.ZodObject<{
206
+ oracle: z.ZodObject<{
207
+ description: z.ZodString;
208
+ limits: z.ZodString;
209
+ }, z.core.$strict>;
210
+ crossChecks: z.ZodArray<z.ZodObject<{
211
+ family: z.ZodString;
212
+ against: z.ZodString;
213
+ matches: z.ZodNumber;
214
+ total: z.ZodNumber;
215
+ artifacts: z.ZodOptional<z.ZodArray<z.ZodString>>;
216
+ }, z.core.$strict>>;
217
+ sets: z.ZodArray<z.ZodObject<{
218
+ gate: z.ZodString;
219
+ artifacts: z.ZodArray<z.ZodString>;
220
+ minCases: z.ZodNumber;
221
+ families: z.ZodDefault<z.ZodArray<z.ZodObject<{
222
+ id: z.ZodString;
223
+ minCases: z.ZodNumber;
224
+ }, z.core.$strict>>>;
225
+ }, z.core.$strict>>;
226
+ gaps: z.ZodString;
227
+ }, z.core.$strict>>;
137
228
  hard: z.ZodDefault<z.ZodBoolean>;
138
229
  feasibility: z.ZodOptional<z.ZodObject<{
139
230
  spike: z.ZodString;
@@ -233,6 +324,34 @@ export declare const contractDocumentSchema: z.ZodObject<{
233
324
  environment: z.ZodString;
234
325
  }, z.core.$strict>>;
235
326
  }, z.core.$strict>;
327
+ gates: z.ZodOptional<z.ZodArray<z.ZodString>>;
328
+ verification: z.ZodOptional<z.ZodEnum<{
329
+ property: "property";
330
+ reference: "reference";
331
+ }>>;
332
+ reference: z.ZodOptional<z.ZodObject<{
333
+ oracle: z.ZodObject<{
334
+ description: z.ZodString;
335
+ limits: z.ZodString;
336
+ }, z.core.$strict>;
337
+ crossChecks: z.ZodArray<z.ZodObject<{
338
+ family: z.ZodString;
339
+ against: z.ZodString;
340
+ matches: z.ZodNumber;
341
+ total: z.ZodNumber;
342
+ artifacts: z.ZodOptional<z.ZodArray<z.ZodString>>;
343
+ }, z.core.$strict>>;
344
+ sets: z.ZodArray<z.ZodObject<{
345
+ gate: z.ZodString;
346
+ artifacts: z.ZodArray<z.ZodString>;
347
+ minCases: z.ZodNumber;
348
+ families: z.ZodDefault<z.ZodArray<z.ZodObject<{
349
+ id: z.ZodString;
350
+ minCases: z.ZodNumber;
351
+ }, z.core.$strict>>>;
352
+ }, z.core.$strict>>;
353
+ gaps: z.ZodString;
354
+ }, z.core.$strict>>;
236
355
  hard: z.ZodDefault<z.ZodBoolean>;
237
356
  feasibility: z.ZodOptional<z.ZodObject<{
238
357
  spike: z.ZodString;
@@ -31,6 +31,57 @@ export const strongPromises = new Set([
31
31
  'completeness',
32
32
  'performance',
33
33
  ]);
34
+ /**
35
+ * Проверка по закреплённым эталонным наборам (`verification: 'reference'`).
36
+ *
37
+ * Ответы независимого эталона (решатель, полный перебор, таблица DP)
38
+ * получены заранее, сверены с другим способом на семействах входов и
39
+ * закреплены артефактами контракта. Gate сверяет реализацию с наборами и
40
+ * отчитывается тем же отчётом свойств: число проверенных входов по свойству
41
+ * и по семействам. Каждый набор принадлежит одному gate: его минимум и
42
+ * минимумы семейств — доля этого gate в покрытии обязательства. Обобщения за
43
+ * пределы наборов такой способ не доказывает — это называет `gaps`.
44
+ */
45
+ export const referenceSchema = z.strictObject({
46
+ /** Эталон и его пределы: версия, предел времени, что исключено из наборов. */
47
+ oracle: z.strictObject({ description: text(), limits: text() }),
48
+ /** Сверка эталона с другим способом: семейство, способ, совпало из всего. */
49
+ crossChecks: z
50
+ .array(z.strictObject({
51
+ family: text(200),
52
+ against: text(500),
53
+ matches: z.number().int().min(0).max(100_000_000),
54
+ total: z.number().int().min(1).max(100_000_000),
55
+ /**
56
+ * Закреплённые файлы, воспроизводящие сверку (скрипт, журнал) — среди
57
+ * артефактов контракта. Без них числа — утверждение автора.
58
+ */
59
+ artifacts: z.array(relativePathSchema).min(1).max(10).optional(),
60
+ }))
61
+ .min(1)
62
+ .max(10),
63
+ sets: z
64
+ .array(z.strictObject({
65
+ /** Gate, который сверяет реализацию с этим набором. */
66
+ gate: idSchema,
67
+ /** Файлы набора — среди артефактов контракта. */
68
+ artifacts: z.array(relativePathSchema).min(1).max(10),
69
+ /** Сколько входов набора gate обязан проверить за прогон. */
70
+ minCases: z.number().int().min(1).max(1_000_000),
71
+ /** Доля семейств покрытия обязательства в этом наборе. */
72
+ families: z
73
+ .array(z.strictObject({
74
+ id: familyIdSchema,
75
+ minCases: z.number().int().min(1).max(1_000_000),
76
+ }))
77
+ .max(20)
78
+ .default([]),
79
+ }))
80
+ .min(1)
81
+ .max(20),
82
+ /** Чего наборы не доказывают: обобщение за пределы входов, классы вне наборов. */
83
+ gaps: text(),
84
+ });
34
85
  export const obligationSchema = z.strictObject({
35
86
  property: propertyIdSchema,
36
87
  /** Существующие требования или критерии приёмки, которые обязательство уточняет. */
@@ -79,6 +130,15 @@ export const obligationSchema = z.strictObject({
79
130
  oracle: text(),
80
131
  benchmark: z.strictObject({ method: text(), environment: text() }).optional(),
81
132
  }),
133
+ /**
134
+ * Gates, исполняющие обязательство; без поля — gate договора. У
135
+ * генеративного обязательства каждый из них проверяет полное покрытие, у
136
+ * эталонного — свои наборы.
137
+ */
138
+ gates: z.array(idSchema).min(1).max(10).optional(),
139
+ /** Способ исполнения: `property` (без поля) — генератор; `reference` — эталонные наборы. */
140
+ verification: z.enum(['property', 'reference']).optional(),
141
+ reference: referenceSchema.optional(),
82
142
  /** Тяжёлый точный алгоритм или жёсткое время: до реализации нужен ограниченный эксперимент. */
83
143
  hard: z.boolean().default(false),
84
144
  feasibility: z
@@ -90,7 +150,10 @@ export const obligationSchema = z.strictObject({
90
150
  });
91
151
  export const checkDeclarationSchema = z.strictObject({
92
152
  version: z.literal(1),
93
- /** Gate, который исполняет проверку (генеративный, с закреплённым checker). */
153
+ /**
154
+ * Gate проверки по умолчанию: исполняет обязательства без своих `gates`
155
+ * (генеративный, с закреплённым checker).
156
+ */
94
157
  gate: idSchema,
95
158
  obligations: z.array(obligationSchema).min(1).max(30),
96
159
  /**
@@ -492,10 +492,12 @@ export declare const statusDataSchema: z.ZodObject<{
492
492
  "provider-auth": "provider-auth";
493
493
  "stale-base": "stale-base";
494
494
  "empty-result": "empty-result";
495
+ unfinished: "unfinished";
495
496
  "scope-violation": "scope-violation";
496
497
  "review-protocol": "review-protocol";
497
498
  merge: "merge";
498
499
  budget: "budget";
500
+ "needs-lead": "needs-lead";
499
501
  }>>>;
500
502
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
501
503
  kind: z.ZodEnum<{
@@ -734,10 +736,12 @@ export declare const eventsDataSchema: z.ZodObject<{
734
736
  "provider-auth": "provider-auth";
735
737
  "stale-base": "stale-base";
736
738
  "empty-result": "empty-result";
739
+ unfinished: "unfinished";
737
740
  "scope-violation": "scope-violation";
738
741
  "review-protocol": "review-protocol";
739
742
  merge: "merge";
740
743
  budget: "budget";
744
+ "needs-lead": "needs-lead";
741
745
  }>;
742
746
  message: z.ZodString;
743
747
  blocked: z.ZodBoolean;
@@ -773,10 +777,12 @@ export declare const eventsDataSchema: z.ZodObject<{
773
777
  "provider-auth": "provider-auth";
774
778
  "stale-base": "stale-base";
775
779
  "empty-result": "empty-result";
780
+ unfinished: "unfinished";
776
781
  "scope-violation": "scope-violation";
777
782
  "review-protocol": "review-protocol";
778
783
  merge: "merge";
779
784
  budget: "budget";
785
+ "needs-lead": "needs-lead";
780
786
  }>>>;
781
787
  }, z.core.$strict> | z.ZodObject<{
782
788
  reason: z.ZodEnum<{
@@ -985,10 +991,12 @@ export declare const eventsDataSchema: z.ZodObject<{
985
991
  "provider-auth": "provider-auth";
986
992
  "stale-base": "stale-base";
987
993
  "empty-result": "empty-result";
994
+ unfinished: "unfinished";
988
995
  "scope-violation": "scope-violation";
989
996
  "review-protocol": "review-protocol";
990
997
  merge: "merge";
991
998
  budget: "budget";
999
+ "needs-lead": "needs-lead";
992
1000
  }>;
993
1001
  message: z.ZodString;
994
1002
  blocked: z.ZodBoolean;
@@ -1024,10 +1032,12 @@ export declare const eventsDataSchema: z.ZodObject<{
1024
1032
  "provider-auth": "provider-auth";
1025
1033
  "stale-base": "stale-base";
1026
1034
  "empty-result": "empty-result";
1035
+ unfinished: "unfinished";
1027
1036
  "scope-violation": "scope-violation";
1028
1037
  "review-protocol": "review-protocol";
1029
1038
  merge: "merge";
1030
1039
  budget: "budget";
1040
+ "needs-lead": "needs-lead";
1031
1041
  }>>>;
1032
1042
  }, z.core.$strict> | z.ZodObject<{
1033
1043
  reason: z.ZodEnum<{
@@ -1242,10 +1252,12 @@ export declare const controlDataSchema: z.ZodObject<{
1242
1252
  "provider-auth": "provider-auth";
1243
1253
  "stale-base": "stale-base";
1244
1254
  "empty-result": "empty-result";
1255
+ unfinished: "unfinished";
1245
1256
  "scope-violation": "scope-violation";
1246
1257
  "review-protocol": "review-protocol";
1247
1258
  merge: "merge";
1248
1259
  budget: "budget";
1260
+ "needs-lead": "needs-lead";
1249
1261
  }>>>;
1250
1262
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
1251
1263
  kind: z.ZodEnum<{
@@ -1881,10 +1893,12 @@ export declare const explainDataSchema: z.ZodObject<{
1881
1893
  "provider-auth": "provider-auth";
1882
1894
  "stale-base": "stale-base";
1883
1895
  "empty-result": "empty-result";
1896
+ unfinished: "unfinished";
1884
1897
  "scope-violation": "scope-violation";
1885
1898
  "review-protocol": "review-protocol";
1886
1899
  merge: "merge";
1887
1900
  budget: "budget";
1901
+ "needs-lead": "needs-lead";
1888
1902
  "runtime-missing": "runtime-missing";
1889
1903
  "controller-busy": "controller-busy";
1890
1904
  "operator-pause": "operator-pause";
@@ -2153,10 +2167,12 @@ export declare const cliDataSchemas: {
2153
2167
  "provider-auth": "provider-auth";
2154
2168
  "stale-base": "stale-base";
2155
2169
  "empty-result": "empty-result";
2170
+ unfinished: "unfinished";
2156
2171
  "scope-violation": "scope-violation";
2157
2172
  "review-protocol": "review-protocol";
2158
2173
  merge: "merge";
2159
2174
  budget: "budget";
2175
+ "needs-lead": "needs-lead";
2160
2176
  }>>>;
2161
2177
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
2162
2178
  kind: z.ZodEnum<{
@@ -2395,10 +2411,12 @@ export declare const cliDataSchemas: {
2395
2411
  "provider-auth": "provider-auth";
2396
2412
  "stale-base": "stale-base";
2397
2413
  "empty-result": "empty-result";
2414
+ unfinished: "unfinished";
2398
2415
  "scope-violation": "scope-violation";
2399
2416
  "review-protocol": "review-protocol";
2400
2417
  merge: "merge";
2401
2418
  budget: "budget";
2419
+ "needs-lead": "needs-lead";
2402
2420
  }>;
2403
2421
  message: z.ZodString;
2404
2422
  blocked: z.ZodBoolean;
@@ -2434,10 +2452,12 @@ export declare const cliDataSchemas: {
2434
2452
  "provider-auth": "provider-auth";
2435
2453
  "stale-base": "stale-base";
2436
2454
  "empty-result": "empty-result";
2455
+ unfinished: "unfinished";
2437
2456
  "scope-violation": "scope-violation";
2438
2457
  "review-protocol": "review-protocol";
2439
2458
  merge: "merge";
2440
2459
  budget: "budget";
2460
+ "needs-lead": "needs-lead";
2441
2461
  }>>>;
2442
2462
  }, z.core.$strict> | z.ZodObject<{
2443
2463
  reason: z.ZodEnum<{
@@ -2646,10 +2666,12 @@ export declare const cliDataSchemas: {
2646
2666
  "provider-auth": "provider-auth";
2647
2667
  "stale-base": "stale-base";
2648
2668
  "empty-result": "empty-result";
2669
+ unfinished: "unfinished";
2649
2670
  "scope-violation": "scope-violation";
2650
2671
  "review-protocol": "review-protocol";
2651
2672
  merge: "merge";
2652
2673
  budget: "budget";
2674
+ "needs-lead": "needs-lead";
2653
2675
  }>;
2654
2676
  message: z.ZodString;
2655
2677
  blocked: z.ZodBoolean;
@@ -2685,10 +2707,12 @@ export declare const cliDataSchemas: {
2685
2707
  "provider-auth": "provider-auth";
2686
2708
  "stale-base": "stale-base";
2687
2709
  "empty-result": "empty-result";
2710
+ unfinished: "unfinished";
2688
2711
  "scope-violation": "scope-violation";
2689
2712
  "review-protocol": "review-protocol";
2690
2713
  merge: "merge";
2691
2714
  budget: "budget";
2715
+ "needs-lead": "needs-lead";
2692
2716
  }>>>;
2693
2717
  }, z.core.$strict> | z.ZodObject<{
2694
2718
  reason: z.ZodEnum<{
@@ -2820,10 +2844,12 @@ export declare const cliDataSchemas: {
2820
2844
  "provider-auth": "provider-auth";
2821
2845
  "stale-base": "stale-base";
2822
2846
  "empty-result": "empty-result";
2847
+ unfinished: "unfinished";
2823
2848
  "scope-violation": "scope-violation";
2824
2849
  "review-protocol": "review-protocol";
2825
2850
  merge: "merge";
2826
2851
  budget: "budget";
2852
+ "needs-lead": "needs-lead";
2827
2853
  }>>>;
2828
2854
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
2829
2855
  kind: z.ZodEnum<{
@@ -2873,10 +2899,12 @@ export declare const cliDataSchemas: {
2873
2899
  "provider-auth": "provider-auth";
2874
2900
  "stale-base": "stale-base";
2875
2901
  "empty-result": "empty-result";
2902
+ unfinished: "unfinished";
2876
2903
  "scope-violation": "scope-violation";
2877
2904
  "review-protocol": "review-protocol";
2878
2905
  merge: "merge";
2879
2906
  budget: "budget";
2907
+ "needs-lead": "needs-lead";
2880
2908
  }>>>;
2881
2909
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
2882
2910
  kind: z.ZodEnum<{
@@ -4181,10 +4209,12 @@ export declare const cliDataSchemas: {
4181
4209
  "provider-auth": "provider-auth";
4182
4210
  "stale-base": "stale-base";
4183
4211
  "empty-result": "empty-result";
4212
+ unfinished: "unfinished";
4184
4213
  "scope-violation": "scope-violation";
4185
4214
  "review-protocol": "review-protocol";
4186
4215
  merge: "merge";
4187
4216
  budget: "budget";
4217
+ "needs-lead": "needs-lead";
4188
4218
  "runtime-missing": "runtime-missing";
4189
4219
  "controller-busy": "controller-busy";
4190
4220
  "operator-pause": "operator-pause";
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export declare const diagnosisActors: readonly ["controller", "lead", "user"];
3
3
  export declare const diagnosisActions: readonly ["none", "wait", "review-plan", "retry", "diagnose-failure", "reset-attempts", "raise-budget", "replan-dependents", "recovery-decision", "user-decision", "resume-queue", "fix-environment", "fix-access"];
4
- export declare const diagnosisCauses: readonly ["provider-auth", "environment", "timeout", "stale-base", "empty-result", "scope-violation", "gate", "review", "review-protocol", "merge", "cancelled", "budget", "unknown", "runtime-missing", "controller-busy", "operator-pause", "approval-required", "not-ready"];
4
+ export declare const diagnosisCauses: readonly ["provider-auth", "environment", "timeout", "stale-base", "empty-result", "unfinished", "scope-violation", "gate", "review", "review-protocol", "merge", "cancelled", "budget", "needs-lead", "unknown", "runtime-missing", "controller-busy", "operator-pause", "approval-required", "not-ready"];
5
5
  export declare const diagnosisPhases: readonly ["preflight", "claim", "implementation", "gates", "review", "integration", "delivery"];
6
6
  /** Объяснение остановки: код, причина, фаза, кто действует и что допустимо. */
7
7
  export declare const stopDiagnosisSchema: z.ZodObject<{
@@ -52,10 +52,12 @@ export declare const stopDiagnosisSchema: z.ZodObject<{
52
52
  "provider-auth": "provider-auth";
53
53
  "stale-base": "stale-base";
54
54
  "empty-result": "empty-result";
55
+ unfinished: "unfinished";
55
56
  "scope-violation": "scope-violation";
56
57
  "review-protocol": "review-protocol";
57
58
  merge: "merge";
58
59
  budget: "budget";
60
+ "needs-lead": "needs-lead";
59
61
  "runtime-missing": "runtime-missing";
60
62
  "controller-busy": "controller-busy";
61
63
  "operator-pause": "operator-pause";
@@ -24,6 +24,7 @@ export const diagnosisCauses = [
24
24
  'timeout',
25
25
  'stale-base',
26
26
  'empty-result',
27
+ 'unfinished',
27
28
  'scope-violation',
28
29
  'gate',
29
30
  'review',
@@ -31,6 +32,7 @@ export const diagnosisCauses = [
31
32
  'merge',
32
33
  'cancelled',
33
34
  'budget',
35
+ 'needs-lead',
34
36
  'unknown',
35
37
  'runtime-missing',
36
38
  'controller-busy',
@@ -107,10 +107,12 @@ export declare const eventPayloads: {
107
107
  "provider-auth": "provider-auth";
108
108
  "stale-base": "stale-base";
109
109
  "empty-result": "empty-result";
110
+ unfinished: "unfinished";
110
111
  "scope-violation": "scope-violation";
111
112
  "review-protocol": "review-protocol";
112
113
  merge: "merge";
113
114
  budget: "budget";
115
+ "needs-lead": "needs-lead";
114
116
  }>;
115
117
  message: z.ZodString;
116
118
  blocked: z.ZodBoolean;
@@ -152,10 +154,12 @@ export declare const eventPayloads: {
152
154
  "provider-auth": "provider-auth";
153
155
  "stale-base": "stale-base";
154
156
  "empty-result": "empty-result";
157
+ unfinished: "unfinished";
155
158
  "scope-violation": "scope-violation";
156
159
  "review-protocol": "review-protocol";
157
160
  merge: "merge";
158
161
  budget: "budget";
162
+ "needs-lead": "needs-lead";
159
163
  }>>>;
160
164
  }, z.core.$strict>;
161
165
  readonly 'control.resumed': z.ZodObject<{
@@ -403,10 +407,12 @@ export declare const runEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
403
407
  "provider-auth": "provider-auth";
404
408
  "stale-base": "stale-base";
405
409
  "empty-result": "empty-result";
410
+ unfinished: "unfinished";
406
411
  "scope-violation": "scope-violation";
407
412
  "review-protocol": "review-protocol";
408
413
  merge: "merge";
409
414
  budget: "budget";
415
+ "needs-lead": "needs-lead";
410
416
  }>;
411
417
  message: z.ZodString;
412
418
  blocked: z.ZodBoolean;
@@ -442,10 +448,12 @@ export declare const runEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
442
448
  "provider-auth": "provider-auth";
443
449
  "stale-base": "stale-base";
444
450
  "empty-result": "empty-result";
451
+ unfinished: "unfinished";
445
452
  "scope-violation": "scope-violation";
446
453
  "review-protocol": "review-protocol";
447
454
  merge: "merge";
448
455
  budget: "budget";
456
+ "needs-lead": "needs-lead";
449
457
  }>>>;
450
458
  }, z.core.$strict> | z.ZodObject<{
451
459
  reason: z.ZodEnum<{
@@ -654,10 +662,12 @@ export declare const runEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
654
662
  "provider-auth": "provider-auth";
655
663
  "stale-base": "stale-base";
656
664
  "empty-result": "empty-result";
665
+ unfinished: "unfinished";
657
666
  "scope-violation": "scope-violation";
658
667
  "review-protocol": "review-protocol";
659
668
  merge: "merge";
660
669
  budget: "budget";
670
+ "needs-lead": "needs-lead";
661
671
  }>;
662
672
  message: z.ZodString;
663
673
  blocked: z.ZodBoolean;
@@ -693,10 +703,12 @@ export declare const runEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
693
703
  "provider-auth": "provider-auth";
694
704
  "stale-base": "stale-base";
695
705
  "empty-result": "empty-result";
706
+ unfinished: "unfinished";
696
707
  "scope-violation": "scope-violation";
697
708
  "review-protocol": "review-protocol";
698
709
  merge: "merge";
699
710
  budget: "budget";
711
+ "needs-lead": "needs-lead";
700
712
  }>>>;
701
713
  }, z.core.$strict> | z.ZodObject<{
702
714
  reason: z.ZodEnum<{