@llm-dev-ops/agentics-cli 2.5.4 → 2.6.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/cli/index.js +80 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/agents.d.ts +7 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +130 -23
- package/dist/commands/agents.js.map +1 -1
- package/dist/errors/transient.d.ts +67 -0
- package/dist/errors/transient.d.ts.map +1 -0
- package/dist/errors/transient.js +260 -0
- package/dist/errors/transient.js.map +1 -0
- package/dist/observability/degradations.d.ts +58 -0
- package/dist/observability/degradations.d.ts.map +1 -0
- package/dist/observability/degradations.js +74 -0
- package/dist/observability/degradations.js.map +1 -0
- package/dist/pipeline/phase1-verdict.d.ts +55 -0
- package/dist/pipeline/phase1-verdict.d.ts.map +1 -0
- package/dist/pipeline/phase1-verdict.js +186 -0
- package/dist/pipeline/phase1-verdict.js.map +1 -0
- package/dist/pipeline/phase2-preflight.d.ts +44 -0
- package/dist/pipeline/phase2-preflight.d.ts.map +1 -0
- package/dist/pipeline/phase2-preflight.js +120 -0
- package/dist/pipeline/phase2-preflight.js.map +1 -0
- package/dist/pipeline/swarm-orchestrator.d.ts.map +1 -1
- package/dist/pipeline/swarm-orchestrator.js +67 -5
- package/dist/pipeline/swarm-orchestrator.js.map +1 -1
- package/dist/synthesis/financial-claim-extractor.d.ts +11 -0
- package/dist/synthesis/financial-claim-extractor.d.ts.map +1 -1
- package/dist/synthesis/financial-claim-extractor.js +24 -0
- package/dist/synthesis/financial-claim-extractor.js.map +1 -1
- package/dist/synthesis/simulation-artifact-generator.d.ts.map +1 -1
- package/dist/synthesis/simulation-artifact-generator.js +28 -3
- package/dist/synthesis/simulation-artifact-generator.js.map +1 -1
- package/dist/synthesis/simulation-renderers.d.ts +1 -1
- package/dist/synthesis/simulation-renderers.d.ts.map +1 -1
- package/dist/synthesis/simulation-renderers.js +39 -13
- package/dist/synthesis/simulation-renderers.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-PIPELINE-089 §1 — Centralized transient-failure classification.
|
|
3
|
+
*
|
|
4
|
+
* The retry loops in `executeNaturalLanguageRoute` (src/commands/agents.ts)
|
|
5
|
+
* used to inline a substring allowlist over `Error.message`:
|
|
6
|
+
*
|
|
7
|
+
* const isRetryable = msg.includes('unavailable')
|
|
8
|
+
* || msg.includes('timeout')
|
|
9
|
+
* || msg.includes('rate exceeded')
|
|
10
|
+
* || msg.includes('econnreset')
|
|
11
|
+
* || msg.includes('econnrefused')
|
|
12
|
+
* || msg.includes('network error')
|
|
13
|
+
* || msg.includes('aborterror');
|
|
14
|
+
*
|
|
15
|
+
* Three problems with that shape:
|
|
16
|
+
*
|
|
17
|
+
* 1. `unreachable` is NOT on the list. Several adapter paths surface that
|
|
18
|
+
* word when a Cloud Run backend is down, and the retry loop then bails
|
|
19
|
+
* on attempt 1 — the exact field-report symptom on 2026-04-22.
|
|
20
|
+
* 2. It only looks at `.message`. Node/undici errors often carry the
|
|
21
|
+
* transient signal on `.code` (ECONNRESET, ETIMEDOUT) or on a wrapped
|
|
22
|
+
* HTTP `response.status` (503, 504). Both were invisible to the
|
|
23
|
+
* substring check.
|
|
24
|
+
* 3. 400-class terminal failures (contract_violation, unauthorized) never
|
|
25
|
+
* had an explicit short-circuit. A future drift that made their message
|
|
26
|
+
* match a retryable substring would silently retry three times.
|
|
27
|
+
*
|
|
28
|
+
* This module exposes:
|
|
29
|
+
* - isTransientFailure(err) — returns true when a retry has a reasonable
|
|
30
|
+
* chance of succeeding (widened allowlist + code + status + cause-chain).
|
|
31
|
+
* - isTerminalFailure(err) — returns true when retrying cannot help
|
|
32
|
+
* (payload / auth / canonical-not-found). Takes precedence over
|
|
33
|
+
* isTransientFailure when both match.
|
|
34
|
+
*
|
|
35
|
+
* Used by: the simulation retry loops at src/commands/agents.ts:4154 and
|
|
36
|
+
* :4505. Future sites should import and reuse the helper instead of
|
|
37
|
+
* re-inlining a substring list.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* True when the failure shape suggests a retry has a reasonable chance of
|
|
41
|
+
* succeeding: network resets, timeouts, 5xx, rate limits, cold-starts.
|
|
42
|
+
*
|
|
43
|
+
* Takes precedence over isTerminalFailure when inspecting a wrapped error:
|
|
44
|
+
* callers should test `isTerminalFailure(e)` first and short-circuit if true.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isTransientFailure(err: unknown): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* True when retrying cannot help: bad payload, bad credentials, canonical
|
|
49
|
+
* 404. Callers should short-circuit their retry loop on true.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isTerminalFailure(err: unknown): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Best-effort classification used by the Phase 1 Health Gate when deciding
|
|
54
|
+
* whether a simulator-level failure should produce a `failed` vs `degraded`
|
|
55
|
+
* verdict.
|
|
56
|
+
*
|
|
57
|
+
* - 'transient' → the retry loop gave up but the error was retryable;
|
|
58
|
+
* environment-flake. Still counts as a failure for verdict purposes
|
|
59
|
+
* (we already retried) but tags the degradation so the user knows a
|
|
60
|
+
* re-run is likely to succeed.
|
|
61
|
+
* - 'terminal' → payload/credentials/canonical. Actionable by user.
|
|
62
|
+
* - 'unknown' → neither signature matched. Treat as terminal for
|
|
63
|
+
* verdict purposes (do not recommend a re-run) but surface the raw
|
|
64
|
+
* message so the user can see what happened.
|
|
65
|
+
*/
|
|
66
|
+
export declare function classifyFailure(err: unknown): 'transient' | 'terminal' | 'unknown';
|
|
67
|
+
//# sourceMappingURL=transient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transient.d.ts","sourceRoot":"","sources":["../../src/errors/transient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA0JH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAiCxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAoBvD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAIlF"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-PIPELINE-089 §1 — Centralized transient-failure classification.
|
|
3
|
+
*
|
|
4
|
+
* The retry loops in `executeNaturalLanguageRoute` (src/commands/agents.ts)
|
|
5
|
+
* used to inline a substring allowlist over `Error.message`:
|
|
6
|
+
*
|
|
7
|
+
* const isRetryable = msg.includes('unavailable')
|
|
8
|
+
* || msg.includes('timeout')
|
|
9
|
+
* || msg.includes('rate exceeded')
|
|
10
|
+
* || msg.includes('econnreset')
|
|
11
|
+
* || msg.includes('econnrefused')
|
|
12
|
+
* || msg.includes('network error')
|
|
13
|
+
* || msg.includes('aborterror');
|
|
14
|
+
*
|
|
15
|
+
* Three problems with that shape:
|
|
16
|
+
*
|
|
17
|
+
* 1. `unreachable` is NOT on the list. Several adapter paths surface that
|
|
18
|
+
* word when a Cloud Run backend is down, and the retry loop then bails
|
|
19
|
+
* on attempt 1 — the exact field-report symptom on 2026-04-22.
|
|
20
|
+
* 2. It only looks at `.message`. Node/undici errors often carry the
|
|
21
|
+
* transient signal on `.code` (ECONNRESET, ETIMEDOUT) or on a wrapped
|
|
22
|
+
* HTTP `response.status` (503, 504). Both were invisible to the
|
|
23
|
+
* substring check.
|
|
24
|
+
* 3. 400-class terminal failures (contract_violation, unauthorized) never
|
|
25
|
+
* had an explicit short-circuit. A future drift that made their message
|
|
26
|
+
* match a retryable substring would silently retry three times.
|
|
27
|
+
*
|
|
28
|
+
* This module exposes:
|
|
29
|
+
* - isTransientFailure(err) — returns true when a retry has a reasonable
|
|
30
|
+
* chance of succeeding (widened allowlist + code + status + cause-chain).
|
|
31
|
+
* - isTerminalFailure(err) — returns true when retrying cannot help
|
|
32
|
+
* (payload / auth / canonical-not-found). Takes precedence over
|
|
33
|
+
* isTransientFailure when both match.
|
|
34
|
+
*
|
|
35
|
+
* Used by: the simulation retry loops at src/commands/agents.ts:4154 and
|
|
36
|
+
* :4505. Future sites should import and reuse the helper instead of
|
|
37
|
+
* re-inlining a substring list.
|
|
38
|
+
*/
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Keyword sets — lowercase compares on error.message
|
|
41
|
+
// ============================================================================
|
|
42
|
+
const TRANSIENT_MESSAGE_KEYWORDS = [
|
|
43
|
+
'unavailable',
|
|
44
|
+
'service_unavailable',
|
|
45
|
+
'unreachable',
|
|
46
|
+
'timeout',
|
|
47
|
+
'timed out',
|
|
48
|
+
'etimedout',
|
|
49
|
+
'rate exceeded',
|
|
50
|
+
'rate limit',
|
|
51
|
+
'too many requests',
|
|
52
|
+
'econnreset',
|
|
53
|
+
'connection reset',
|
|
54
|
+
'econnrefused',
|
|
55
|
+
'connection refused',
|
|
56
|
+
'enotfound',
|
|
57
|
+
'eai_again',
|
|
58
|
+
'network error',
|
|
59
|
+
'aborterror',
|
|
60
|
+
'socket hang up',
|
|
61
|
+
'und_err_socket',
|
|
62
|
+
'upstream connect error',
|
|
63
|
+
'upstream request timeout',
|
|
64
|
+
];
|
|
65
|
+
const TERMINAL_MESSAGE_KEYWORDS = [
|
|
66
|
+
'contract_violation',
|
|
67
|
+
'contract violation',
|
|
68
|
+
'invalid_payload',
|
|
69
|
+
'bad request',
|
|
70
|
+
'malformed',
|
|
71
|
+
'unauthorized',
|
|
72
|
+
'forbidden',
|
|
73
|
+
'invalid api key',
|
|
74
|
+
'invalid credentials',
|
|
75
|
+
'payload_too_large',
|
|
76
|
+
'payload too large',
|
|
77
|
+
];
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Error codes — exact match on error.code (typically Node/undici/fetch)
|
|
80
|
+
// ============================================================================
|
|
81
|
+
const TRANSIENT_ERROR_CODES = new Set([
|
|
82
|
+
'ECONNRESET',
|
|
83
|
+
'ECONNREFUSED',
|
|
84
|
+
'ETIMEDOUT',
|
|
85
|
+
'ESOCKETTIMEDOUT',
|
|
86
|
+
'ENOTFOUND',
|
|
87
|
+
'EAI_AGAIN',
|
|
88
|
+
'EPIPE',
|
|
89
|
+
'UND_ERR_SOCKET',
|
|
90
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
91
|
+
'UND_ERR_HEADERS_TIMEOUT',
|
|
92
|
+
'UND_ERR_BODY_TIMEOUT',
|
|
93
|
+
'AbortError',
|
|
94
|
+
]);
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// HTTP statuses — exact match on error.status or error.response.status
|
|
97
|
+
// ============================================================================
|
|
98
|
+
const TRANSIENT_HTTP_STATUSES = new Set([
|
|
99
|
+
408, // Request Timeout
|
|
100
|
+
425, // Too Early
|
|
101
|
+
429, // Too Many Requests (retry-after)
|
|
102
|
+
500, // Internal Server Error (often transient in Cloud Run)
|
|
103
|
+
502, // Bad Gateway
|
|
104
|
+
503, // Service Unavailable
|
|
105
|
+
504, // Gateway Timeout
|
|
106
|
+
522, // Cloudflare connection timeout
|
|
107
|
+
524, // Cloudflare a timeout occurred
|
|
108
|
+
]);
|
|
109
|
+
const TERMINAL_HTTP_STATUSES = new Set([
|
|
110
|
+
400, // Bad Request
|
|
111
|
+
401, // Unauthorized
|
|
112
|
+
403, // Forbidden
|
|
113
|
+
404, // Not Found (ambiguous — only terminal when path canonical; callers that know otherwise can override)
|
|
114
|
+
405, // Method Not Allowed
|
|
115
|
+
409, // Conflict
|
|
116
|
+
410, // Gone
|
|
117
|
+
413, // Payload Too Large
|
|
118
|
+
422, // Unprocessable Entity
|
|
119
|
+
]);
|
|
120
|
+
// ============================================================================
|
|
121
|
+
// Unwrapping helpers
|
|
122
|
+
// ============================================================================
|
|
123
|
+
const MAX_CAUSE_DEPTH = 3;
|
|
124
|
+
function extractStatus(err) {
|
|
125
|
+
if (typeof err.status === 'number')
|
|
126
|
+
return err.status;
|
|
127
|
+
if (typeof err.statusCode === 'number')
|
|
128
|
+
return err.statusCode;
|
|
129
|
+
const resp = err.response;
|
|
130
|
+
if (resp && typeof resp === 'object') {
|
|
131
|
+
if (typeof resp.status === 'number')
|
|
132
|
+
return resp.status;
|
|
133
|
+
if (typeof resp.statusCode === 'number')
|
|
134
|
+
return resp.statusCode;
|
|
135
|
+
}
|
|
136
|
+
// Parse "HTTP 503", "status 504", "504 Gateway Timeout" out of message
|
|
137
|
+
if (typeof err.message === 'string') {
|
|
138
|
+
const m = err.message.match(/\b(?:HTTP\s*)?(\d{3})\b/);
|
|
139
|
+
if (m) {
|
|
140
|
+
const n = Number(m[1]);
|
|
141
|
+
if (n >= 400 && n < 600)
|
|
142
|
+
return n;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
function extractCode(err) {
|
|
148
|
+
if (typeof err.code === 'string')
|
|
149
|
+
return err.code;
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
function extractMessage(err) {
|
|
153
|
+
if (typeof err.message === 'string')
|
|
154
|
+
return err.message.toLowerCase();
|
|
155
|
+
return '';
|
|
156
|
+
}
|
|
157
|
+
/** Walk the `.cause` chain up to MAX_CAUSE_DEPTH levels, flattening fields into an array. */
|
|
158
|
+
function unwrapChain(err) {
|
|
159
|
+
const chain = [];
|
|
160
|
+
let cur = err;
|
|
161
|
+
for (let i = 0; i <= MAX_CAUSE_DEPTH && cur; i++) {
|
|
162
|
+
if (cur && typeof cur === 'object') {
|
|
163
|
+
chain.push(cur);
|
|
164
|
+
cur = cur.cause;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return chain;
|
|
171
|
+
}
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// Public API
|
|
174
|
+
// ============================================================================
|
|
175
|
+
/**
|
|
176
|
+
* True when the failure shape suggests a retry has a reasonable chance of
|
|
177
|
+
* succeeding: network resets, timeouts, 5xx, rate limits, cold-starts.
|
|
178
|
+
*
|
|
179
|
+
* Takes precedence over isTerminalFailure when inspecting a wrapped error:
|
|
180
|
+
* callers should test `isTerminalFailure(e)` first and short-circuit if true.
|
|
181
|
+
*/
|
|
182
|
+
export function isTransientFailure(err) {
|
|
183
|
+
if (err == null)
|
|
184
|
+
return false;
|
|
185
|
+
// Raw string errors: substring match only.
|
|
186
|
+
if (typeof err === 'string') {
|
|
187
|
+
const lower = err.toLowerCase();
|
|
188
|
+
return TRANSIENT_MESSAGE_KEYWORDS.some(k => lower.includes(k));
|
|
189
|
+
}
|
|
190
|
+
if (typeof err !== 'object')
|
|
191
|
+
return false;
|
|
192
|
+
const chain = unwrapChain(err);
|
|
193
|
+
for (const link of chain) {
|
|
194
|
+
// HTTP status — strongest signal.
|
|
195
|
+
const status = extractStatus(link);
|
|
196
|
+
if (status !== undefined) {
|
|
197
|
+
if (TRANSIENT_HTTP_STATUSES.has(status))
|
|
198
|
+
return true;
|
|
199
|
+
// If the status is in the terminal set, the caller should have
|
|
200
|
+
// already short-circuited via isTerminalFailure. We do NOT return
|
|
201
|
+
// false here because a wrapper may carry a transient signal elsewhere
|
|
202
|
+
// in the chain (e.g. ETIMEDOUT wrapped as HTTP 500).
|
|
203
|
+
}
|
|
204
|
+
// Error code — Node/undici/fetch.
|
|
205
|
+
const code = extractCode(link);
|
|
206
|
+
if (code && TRANSIENT_ERROR_CODES.has(code))
|
|
207
|
+
return true;
|
|
208
|
+
// Message substring — widened keyword set.
|
|
209
|
+
const msg = extractMessage(link);
|
|
210
|
+
if (msg && TRANSIENT_MESSAGE_KEYWORDS.some(k => msg.includes(k)))
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* True when retrying cannot help: bad payload, bad credentials, canonical
|
|
217
|
+
* 404. Callers should short-circuit their retry loop on true.
|
|
218
|
+
*/
|
|
219
|
+
export function isTerminalFailure(err) {
|
|
220
|
+
if (err == null)
|
|
221
|
+
return false;
|
|
222
|
+
if (typeof err === 'string') {
|
|
223
|
+
const lower = err.toLowerCase();
|
|
224
|
+
return TERMINAL_MESSAGE_KEYWORDS.some(k => lower.includes(k));
|
|
225
|
+
}
|
|
226
|
+
if (typeof err !== 'object')
|
|
227
|
+
return false;
|
|
228
|
+
const chain = unwrapChain(err);
|
|
229
|
+
for (const link of chain) {
|
|
230
|
+
const status = extractStatus(link);
|
|
231
|
+
if (status !== undefined && TERMINAL_HTTP_STATUSES.has(status))
|
|
232
|
+
return true;
|
|
233
|
+
const msg = extractMessage(link);
|
|
234
|
+
if (msg && TERMINAL_MESSAGE_KEYWORDS.some(k => msg.includes(k)))
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Best-effort classification used by the Phase 1 Health Gate when deciding
|
|
241
|
+
* whether a simulator-level failure should produce a `failed` vs `degraded`
|
|
242
|
+
* verdict.
|
|
243
|
+
*
|
|
244
|
+
* - 'transient' → the retry loop gave up but the error was retryable;
|
|
245
|
+
* environment-flake. Still counts as a failure for verdict purposes
|
|
246
|
+
* (we already retried) but tags the degradation so the user knows a
|
|
247
|
+
* re-run is likely to succeed.
|
|
248
|
+
* - 'terminal' → payload/credentials/canonical. Actionable by user.
|
|
249
|
+
* - 'unknown' → neither signature matched. Treat as terminal for
|
|
250
|
+
* verdict purposes (do not recommend a re-run) but surface the raw
|
|
251
|
+
* message so the user can see what happened.
|
|
252
|
+
*/
|
|
253
|
+
export function classifyFailure(err) {
|
|
254
|
+
if (isTerminalFailure(err))
|
|
255
|
+
return 'terminal';
|
|
256
|
+
if (isTransientFailure(err))
|
|
257
|
+
return 'transient';
|
|
258
|
+
return 'unknown';
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=transient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transient.js","sourceRoot":"","sources":["../../src/errors/transient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-PIPELINE-089 §2 — Trace-scoped degradation sink.
|
|
3
|
+
*
|
|
4
|
+
* The Phase 1 Health Gate needs to know which degradations occurred during
|
|
5
|
+
* a run in order to classify the verdict as `healthy | degraded | failed`.
|
|
6
|
+
* Degradation signals come from multiple modules that do not share a call
|
|
7
|
+
* stack: the agent dispatcher (local-compute fallbacks), the consensus
|
|
8
|
+
* validator (`[pipeline-017]`), the pre-render pass (`[pipeline-072]`),
|
|
9
|
+
* and the LLM synthesis tag-survival check (`[exec-docs]`).
|
|
10
|
+
*
|
|
11
|
+
* Rather than thread a collector through every signature, this module
|
|
12
|
+
* exposes a process-local Map keyed by the correlation/trace id. Each
|
|
13
|
+
* emission site makes a one-line call:
|
|
14
|
+
*
|
|
15
|
+
* recordDegradation(traceId, { code: 'local-fallback',
|
|
16
|
+
* message: 'costops/attribution using local compute',
|
|
17
|
+
* source: 'agents-dispatcher' });
|
|
18
|
+
*
|
|
19
|
+
* The verdict compute step at the end of `executeNaturalLanguageRoute`
|
|
20
|
+
* calls `drainDegradations(traceId)` to collect all entries and clear the
|
|
21
|
+
* bucket. Clearing is important so subsequent runs in the same process
|
|
22
|
+
* (tests, long-lived daemons) do not leak state.
|
|
23
|
+
*
|
|
24
|
+
* This is intentionally NOT a general-purpose telemetry channel. It
|
|
25
|
+
* captures pipeline-health-relevant signals only. High-volume logs keep
|
|
26
|
+
* going to stderr as before.
|
|
27
|
+
*/
|
|
28
|
+
export interface Degradation {
|
|
29
|
+
/** Short stable identifier. Used by UIs and tests to key off the failure class. */
|
|
30
|
+
code: DegradationCode;
|
|
31
|
+
/** Human-readable one-liner. Shown in the Phase 1 banner verbatim. */
|
|
32
|
+
message: string;
|
|
33
|
+
/** Which phase emitted the signal. `1` covers everything inside Phase 1. */
|
|
34
|
+
phase?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
35
|
+
/** Optional module/domain that produced the signal — diagnosis aid. */
|
|
36
|
+
source?: string;
|
|
37
|
+
}
|
|
38
|
+
export type DegradationCode = 'local-fallback' | 'agent-error' | 'agent-preflight-unhealthy' | 'consensus-low' | 'sector-unknown' | 'tag-survival-failed' | 'artifact-missing' | 'simulator-transient' | 'simulator-terminal' | 'synthesis-unavailable';
|
|
39
|
+
/**
|
|
40
|
+
* Record a degradation against a trace. Safe to call with an empty trace
|
|
41
|
+
* id — the call silently no-ops rather than binding to a shared ''
|
|
42
|
+
* bucket that would cross-contaminate runs.
|
|
43
|
+
*/
|
|
44
|
+
export declare function recordDegradation(traceId: string | undefined, d: Degradation): void;
|
|
45
|
+
/**
|
|
46
|
+
* Return all degradations recorded against `traceId` (in insertion order)
|
|
47
|
+
* and clear the bucket. Returns an empty array if the trace has no entries.
|
|
48
|
+
*/
|
|
49
|
+
export declare function drainDegradations(traceId: string | undefined): Degradation[];
|
|
50
|
+
/**
|
|
51
|
+
* Non-destructive read — for tests and for cases where the caller wants to
|
|
52
|
+
* inspect the bucket without draining (e.g. a post-phase snapshot without
|
|
53
|
+
* clearing state that later phases will add to).
|
|
54
|
+
*/
|
|
55
|
+
export declare function peekDegradations(traceId: string | undefined): readonly Degradation[];
|
|
56
|
+
/** Test helper — clears ALL trace buckets. Do not use in production paths. */
|
|
57
|
+
export declare function __resetDegradationsForTests(): void;
|
|
58
|
+
//# sourceMappingURL=degradations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"degradations.d.ts","sourceRoot":"","sources":["../../src/observability/degradations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,IAAI,EAAE,eAAe,CAAC;IACtB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,aAAa,GACb,2BAA2B,GAC3B,eAAe,GACf,gBAAgB,GAChB,qBAAqB,GACrB,kBAAkB,GAClB,qBAAqB,GACrB,oBAAoB,GACpB,uBAAuB,CAAC;AAQ5B;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI,CAQnF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,WAAW,EAAE,CAGpF;AAED,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-PIPELINE-089 §2 — Trace-scoped degradation sink.
|
|
3
|
+
*
|
|
4
|
+
* The Phase 1 Health Gate needs to know which degradations occurred during
|
|
5
|
+
* a run in order to classify the verdict as `healthy | degraded | failed`.
|
|
6
|
+
* Degradation signals come from multiple modules that do not share a call
|
|
7
|
+
* stack: the agent dispatcher (local-compute fallbacks), the consensus
|
|
8
|
+
* validator (`[pipeline-017]`), the pre-render pass (`[pipeline-072]`),
|
|
9
|
+
* and the LLM synthesis tag-survival check (`[exec-docs]`).
|
|
10
|
+
*
|
|
11
|
+
* Rather than thread a collector through every signature, this module
|
|
12
|
+
* exposes a process-local Map keyed by the correlation/trace id. Each
|
|
13
|
+
* emission site makes a one-line call:
|
|
14
|
+
*
|
|
15
|
+
* recordDegradation(traceId, { code: 'local-fallback',
|
|
16
|
+
* message: 'costops/attribution using local compute',
|
|
17
|
+
* source: 'agents-dispatcher' });
|
|
18
|
+
*
|
|
19
|
+
* The verdict compute step at the end of `executeNaturalLanguageRoute`
|
|
20
|
+
* calls `drainDegradations(traceId)` to collect all entries and clear the
|
|
21
|
+
* bucket. Clearing is important so subsequent runs in the same process
|
|
22
|
+
* (tests, long-lived daemons) do not leak state.
|
|
23
|
+
*
|
|
24
|
+
* This is intentionally NOT a general-purpose telemetry channel. It
|
|
25
|
+
* captures pipeline-health-relevant signals only. High-volume logs keep
|
|
26
|
+
* going to stderr as before.
|
|
27
|
+
*/
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Storage — process-local, trace-keyed.
|
|
30
|
+
// ============================================================================
|
|
31
|
+
const buckets = new Map();
|
|
32
|
+
/**
|
|
33
|
+
* Record a degradation against a trace. Safe to call with an empty trace
|
|
34
|
+
* id — the call silently no-ops rather than binding to a shared ''
|
|
35
|
+
* bucket that would cross-contaminate runs.
|
|
36
|
+
*/
|
|
37
|
+
export function recordDegradation(traceId, d) {
|
|
38
|
+
if (!traceId)
|
|
39
|
+
return;
|
|
40
|
+
let bucket = buckets.get(traceId);
|
|
41
|
+
if (!bucket) {
|
|
42
|
+
bucket = [];
|
|
43
|
+
buckets.set(traceId, bucket);
|
|
44
|
+
}
|
|
45
|
+
bucket.push(d);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return all degradations recorded against `traceId` (in insertion order)
|
|
49
|
+
* and clear the bucket. Returns an empty array if the trace has no entries.
|
|
50
|
+
*/
|
|
51
|
+
export function drainDegradations(traceId) {
|
|
52
|
+
if (!traceId)
|
|
53
|
+
return [];
|
|
54
|
+
const bucket = buckets.get(traceId);
|
|
55
|
+
if (!bucket)
|
|
56
|
+
return [];
|
|
57
|
+
buckets.delete(traceId);
|
|
58
|
+
return bucket;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Non-destructive read — for tests and for cases where the caller wants to
|
|
62
|
+
* inspect the bucket without draining (e.g. a post-phase snapshot without
|
|
63
|
+
* clearing state that later phases will add to).
|
|
64
|
+
*/
|
|
65
|
+
export function peekDegradations(traceId) {
|
|
66
|
+
if (!traceId)
|
|
67
|
+
return [];
|
|
68
|
+
return buckets.get(traceId) ?? [];
|
|
69
|
+
}
|
|
70
|
+
/** Test helper — clears ALL trace buckets. Do not use in production paths. */
|
|
71
|
+
export function __resetDegradationsForTests() {
|
|
72
|
+
buckets.clear();
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=degradations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"degradations.js","sourceRoot":"","sources":["../../src/observability/degradations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAyBH,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B,EAAE,CAAc;IAC3E,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,2BAA2B;IACzC,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-PIPELINE-089 §2 — Phase 1 Health Gate.
|
|
3
|
+
*
|
|
4
|
+
* Classifies the outcome of `executeNaturalLanguageRoute` (Phase 1) into
|
|
5
|
+
* one of three verdicts:
|
|
6
|
+
*
|
|
7
|
+
* - 'failed' — auto-chain must be skipped; user sees the specific cause.
|
|
8
|
+
* - 'degraded' — auto-chain proceeds, but we warn loudly about what is
|
|
9
|
+
* missing so the user can judge the output.
|
|
10
|
+
* - 'healthy' — all inputs intact; auto-chain proceeds silently.
|
|
11
|
+
*
|
|
12
|
+
* Inputs:
|
|
13
|
+
* - invocations: the per-agent dispatch results (from RouteResult)
|
|
14
|
+
* - degradations: the list drained from the degradation sink (tag
|
|
15
|
+
* survival, consensus, sector-classifier, local
|
|
16
|
+
* fallbacks, etc.)
|
|
17
|
+
* - artifactFiles: the list of files the artifact generator wrote
|
|
18
|
+
*
|
|
19
|
+
* The verdict is computed structurally — no stderr parsing, no global
|
|
20
|
+
* state. Same inputs always produce the same verdict.
|
|
21
|
+
*/
|
|
22
|
+
import type { Degradation } from '../observability/degradations.js';
|
|
23
|
+
export type Phase1Verdict = 'healthy' | 'degraded' | 'failed';
|
|
24
|
+
export interface Phase1VerdictResult {
|
|
25
|
+
verdict: Phase1Verdict;
|
|
26
|
+
degradations: Degradation[];
|
|
27
|
+
/** Concise reason string for the banner — single sentence. */
|
|
28
|
+
reason: string;
|
|
29
|
+
/** Counts used by the classifier, preserved for status.json consumers. */
|
|
30
|
+
stats: {
|
|
31
|
+
totalAgents: number;
|
|
32
|
+
succeededAgents: number;
|
|
33
|
+
erroredAgents: number;
|
|
34
|
+
artifactCount: number;
|
|
35
|
+
simulatorStatus: 'succeeded' | 'failed-transient' | 'failed-terminal' | 'failed-unknown' | 'not-invoked';
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
interface InvocationLike {
|
|
39
|
+
intent: {
|
|
40
|
+
domain: string;
|
|
41
|
+
agent: string;
|
|
42
|
+
};
|
|
43
|
+
result: unknown;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compute the Phase 1 verdict from structural dispatch results plus the
|
|
47
|
+
* drained degradation list.
|
|
48
|
+
*
|
|
49
|
+
* @param invocations Per-agent invocation results (as `multi.result.invocations`)
|
|
50
|
+
* @param degradations Collected degradation entries for this trace
|
|
51
|
+
* @param artifactFiles Files the artifact generator produced on disk
|
|
52
|
+
*/
|
|
53
|
+
export declare function computePhase1Verdict(invocations: readonly InvocationLike[], degradations: readonly Degradation[], artifactFiles: readonly string[]): Phase1VerdictResult;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=phase1-verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase1-verdict.d.ts","sourceRoot":"","sources":["../../src/pipeline/phase1-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,WAAW,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;KAC1G,CAAC;CACH;AAED,UAAU,cAAc;IACtB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE,OAAO,CAAC;CACjB;AASD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,SAAS,cAAc,EAAE,EACtC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,mBAAmB,CAoHrB"}
|