wicked-crew 0.16.3 → 0.16.5
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/api/ask-paths.d.ts +5 -2
- package/dist/api/ask-paths.d.ts.map +1 -1
- package/dist/api/ask-paths.js +6 -3
- package/dist/api/ask-paths.js.map +1 -1
- package/dist/api/chat-mcp.d.ts +42 -0
- package/dist/api/chat-mcp.d.ts.map +1 -0
- package/dist/api/chat-mcp.js +93 -0
- package/dist/api/chat-mcp.js.map +1 -0
- package/dist/api/chat-scope.d.ts +8 -3
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +17 -5
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/chat-workflow.d.ts +60 -0
- package/dist/api/chat-workflow.d.ts.map +1 -0
- package/dist/api/chat-workflow.js +80 -0
- package/dist/api/chat-workflow.js.map +1 -0
- package/dist/api/delivery-assurance.d.ts +3 -0
- package/dist/api/delivery-assurance.d.ts.map +1 -1
- package/dist/api/delivery-assurance.js +11 -0
- package/dist/api/delivery-assurance.js.map +1 -1
- package/dist/api/endpoint-manifest-live.d.ts.map +1 -1
- package/dist/api/endpoint-manifest-live.js +2 -0
- package/dist/api/endpoint-manifest-live.js.map +1 -1
- package/dist/api/mcp.d.ts +5 -5
- package/dist/api/mcp.js +1 -1
- package/dist/api/needs.d.ts +116 -0
- package/dist/api/needs.d.ts.map +1 -0
- package/dist/api/needs.js +618 -0
- package/dist/api/needs.js.map +1 -0
- package/dist/api/project-aggregates.d.ts +2 -2
- package/dist/api/routes.d.ts +114 -3
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +327 -31
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-timing-index.d.ts +6 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +18 -0
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/server.d.ts +15 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +147 -2
- package/dist/api/server.js.map +1 -1
- package/dist/api/system-snapshot.d.ts +7 -15
- package/dist/api/system-snapshot.d.ts.map +1 -1
- package/dist/api/system-snapshot.js +7 -115
- package/dist/api/system-snapshot.js.map +1 -1
- package/dist/core/run-identity.d.ts.map +1 -1
- package/dist/core/run-identity.js +3 -0
- package/dist/core/run-identity.js.map +1 -1
- package/dist/editors/conformance-runtime.d.ts +55 -0
- package/dist/editors/conformance-runtime.d.ts.map +1 -0
- package/dist/editors/conformance-runtime.js +138 -0
- package/dist/editors/conformance-runtime.js.map +1 -0
- package/dist/editors/pack-install.d.ts +6 -2
- package/dist/editors/pack-install.d.ts.map +1 -1
- package/dist/editors/pack-install.js +63 -45
- package/dist/editors/pack-install.js.map +1 -1
- package/dist/editors/registry.d.ts +10 -10
- package/dist/evals/capture.d.ts +93 -0
- package/dist/evals/capture.d.ts.map +1 -0
- package/dist/evals/capture.js +419 -0
- package/dist/evals/capture.js.map +1 -0
- package/dist/evals/replay.d.ts +33 -0
- package/dist/evals/replay.d.ts.map +1 -0
- package/dist/evals/replay.js +87 -0
- package/dist/evals/replay.js.map +1 -0
- package/dist/evals/routes.d.ts +48 -0
- package/dist/evals/routes.d.ts.map +1 -0
- package/dist/evals/routes.js +121 -0
- package/dist/evals/routes.js.map +1 -0
- package/dist/evals/run-cli.d.ts +31 -0
- package/dist/evals/run-cli.d.ts.map +1 -0
- package/dist/evals/run-cli.js +128 -0
- package/dist/evals/run-cli.js.map +1 -0
- package/dist/evals/runner.d.ts +34 -0
- package/dist/evals/runner.d.ts.map +1 -0
- package/dist/evals/runner.js +181 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/evals/score.d.ts +31 -0
- package/dist/evals/score.d.ts.map +1 -0
- package/dist/evals/score.js +191 -0
- package/dist/evals/score.js.map +1 -0
- package/dist/evals/seed-needs-you.d.ts +17 -0
- package/dist/evals/seed-needs-you.d.ts.map +1 -0
- package/dist/evals/seed-needs-you.js +57 -0
- package/dist/evals/seed-needs-you.js.map +1 -0
- package/dist/evals/seed-rig.d.ts +9 -0
- package/dist/evals/seed-rig.d.ts.map +1 -0
- package/dist/evals/seed-rig.js +156 -0
- package/dist/evals/seed-rig.js.map +1 -0
- package/dist/evals/stats.d.ts +31 -0
- package/dist/evals/stats.d.ts.map +1 -0
- package/dist/evals/stats.js +59 -0
- package/dist/evals/stats.js.map +1 -0
- package/dist/evals/steering.d.ts +9 -0
- package/dist/evals/steering.d.ts.map +1 -0
- package/dist/evals/steering.js +25 -0
- package/dist/evals/steering.js.map +1 -0
- package/dist/evals/store.d.ts +26 -0
- package/dist/evals/store.d.ts.map +1 -0
- package/dist/evals/store.js +96 -0
- package/dist/evals/store.js.map +1 -0
- package/dist/evals/synthetic.d.ts +17 -0
- package/dist/evals/synthetic.d.ts.map +1 -0
- package/dist/evals/synthetic.js +71 -0
- package/dist/evals/synthetic.js.map +1 -0
- package/dist/evals/types.d.ts +29 -0
- package/dist/evals/types.d.ts.map +1 -0
- package/dist/evals/types.js +25 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/evals/workflow.d.ts +33 -0
- package/dist/evals/workflow.d.ts.map +1 -0
- package/dist/evals/workflow.js +66 -0
- package/dist/evals/workflow.js.map +1 -0
- package/dist/insights/analyze-cli.d.ts +18 -0
- package/dist/insights/analyze-cli.d.ts.map +1 -0
- package/dist/insights/analyze-cli.js +71 -0
- package/dist/insights/analyze-cli.js.map +1 -0
- package/dist/insights/analyze.d.ts +136 -0
- package/dist/insights/analyze.d.ts.map +1 -0
- package/dist/insights/analyze.js +358 -0
- package/dist/insights/analyze.js.map +1 -0
- package/dist/insights/review-service.d.ts +127 -0
- package/dist/insights/review-service.d.ts.map +1 -0
- package/dist/insights/review-service.js +392 -0
- package/dist/insights/review-service.js.map +1 -0
- package/dist/insights/routes.d.ts +15 -0
- package/dist/insights/routes.d.ts.map +1 -0
- package/dist/insights/routes.js +66 -0
- package/dist/insights/routes.js.map +1 -0
- package/dist/insights/run-facts.d.ts +64 -0
- package/dist/insights/run-facts.d.ts.map +1 -0
- package/dist/insights/run-facts.js +152 -0
- package/dist/insights/run-facts.js.map +1 -0
- package/dist/insights/stats.d.ts +38 -0
- package/dist/insights/stats.d.ts.map +1 -0
- package/dist/insights/stats.js +102 -0
- package/dist/insights/stats.js.map +1 -0
- package/dist/insights/store.d.ts +89 -0
- package/dist/insights/store.d.ts.map +1 -0
- package/dist/insights/store.js +87 -0
- package/dist/insights/store.js.map +1 -0
- package/dist/insights/workflow.d.ts +22 -0
- package/dist/insights/workflow.d.ts.map +1 -0
- package/dist/insights/workflow.js +39 -0
- package/dist/insights/workflow.js.map +1 -0
- package/dist/mcp/probe.d.ts +18 -3
- package/dist/mcp/probe.d.ts.map +1 -1
- package/dist/mcp/probe.js +61 -9
- package/dist/mcp/probe.js.map +1 -1
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +8 -4
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts +12 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +24 -2
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +10 -2
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/ledger.d.ts +20 -0
- package/dist/qe/ledger.d.ts.map +1 -1
- package/dist/qe/ledger.js +83 -3
- package/dist/qe/ledger.js.map +1 -1
- package/dist/schedules/routes.d.ts +48 -0
- package/dist/schedules/routes.d.ts.map +1 -0
- package/dist/schedules/routes.js +72 -0
- package/dist/schedules/routes.js.map +1 -0
- package/dist/schedules/scheduler.d.ts +58 -0
- package/dist/schedules/scheduler.d.ts.map +1 -0
- package/dist/schedules/scheduler.js +194 -0
- package/dist/schedules/scheduler.js.map +1 -0
- package/dist/schedules/store.d.ts +67 -0
- package/dist/schedules/store.d.ts.map +1 -0
- package/dist/schedules/store.js +148 -0
- package/dist/schedules/store.js.map +1 -0
- package/dist/team/routes.d.ts +10 -0
- package/dist/team/routes.d.ts.map +1 -1
- package/dist/team/routes.js +3 -0
- package/dist/team/routes.js.map +1 -1
- package/endpoint-manifest.json +132 -1
- package/package.json +4 -3
- package/workflows/review-recent-work.json +54 -0
- package/workflows/run-evals.json +29 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* The `review-recent-work` workflow's `analyze` Tool phase (DES-RUNS-REVIEW-001 §3): reads the snapshot crew
|
|
4
|
+
* prepared for this run and writes `facts.json` beside it. Deterministic; the model never runs here.
|
|
5
|
+
*
|
|
6
|
+
* node analyze-cli.js --reviews-dir <dir> # the run's dir is <dir>/$WICKED_RUN_ID (the engine sets it)
|
|
7
|
+
* node analyze-cli.js --dir <run dir> # explicit (tests, by hand)
|
|
8
|
+
*
|
|
9
|
+
* Exit 0 with a one-paragraph summary on stdout; exit 1 with the reason on stderr.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { pathToFileURL } from 'node:url';
|
|
14
|
+
import { analyze } from './analyze.js';
|
|
15
|
+
export const SNAPSHOT_FILE = 'snapshot.json';
|
|
16
|
+
export const FACTS_FILE = 'facts.json';
|
|
17
|
+
export const REPORT_FILE = 'report.json';
|
|
18
|
+
/** A run id is one plain path segment (never `..`, never a separator). */
|
|
19
|
+
const RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
|
|
20
|
+
export function runDirFrom(argv, env) {
|
|
21
|
+
const flag = (name) => {
|
|
22
|
+
const i = argv.indexOf(name);
|
|
23
|
+
return i >= 0 ? argv[i + 1] : undefined;
|
|
24
|
+
};
|
|
25
|
+
const dir = flag('--dir');
|
|
26
|
+
if (dir !== undefined)
|
|
27
|
+
return resolve(dir);
|
|
28
|
+
const reviews = flag('--reviews-dir');
|
|
29
|
+
if (reviews === undefined)
|
|
30
|
+
throw new Error('give --dir <run dir> or --reviews-dir <dir> (with WICKED_RUN_ID set)');
|
|
31
|
+
const runId = env['WICKED_RUN_ID'] ?? '';
|
|
32
|
+
if (!RUN_ID.test(runId) || runId.includes('..'))
|
|
33
|
+
throw new Error(`WICKED_RUN_ID is not a run id: ${JSON.stringify(runId)}`);
|
|
34
|
+
return join(resolve(reviews), runId);
|
|
35
|
+
}
|
|
36
|
+
export function summaryOf(f) {
|
|
37
|
+
const t = f.totals;
|
|
38
|
+
return [
|
|
39
|
+
`analyzed ${t.runs} runs in the window (${t.passed} passed, ${t.failed} failed, ${t.cancelled} cancelled, ${t.open} open) against ${t.baselineRuns} baseline runs`,
|
|
40
|
+
`${f.metrics.length} metric cells, ${f.improvements.length} improvements, ${f.regressions.length} regressions`,
|
|
41
|
+
`${f.candidates.length} candidates: ${f.recommended.length} recommended, ${f.watching.length} watching`,
|
|
42
|
+
].join('; ');
|
|
43
|
+
}
|
|
44
|
+
export function runAnalyze(dir) {
|
|
45
|
+
const snapPath = join(dir, SNAPSHOT_FILE);
|
|
46
|
+
if (!existsSync(snapPath))
|
|
47
|
+
throw new Error(`no ${SNAPSHOT_FILE} in ${dir}: crew prepares it when it launches the review`);
|
|
48
|
+
const snapshot = JSON.parse(readFileSync(snapPath, 'utf8'));
|
|
49
|
+
if (snapshot?.version !== 1 || !Array.isArray(snapshot.runs))
|
|
50
|
+
throw new Error(`${SNAPSHOT_FILE} is not a version-1 snapshot`);
|
|
51
|
+
const facts = analyze(snapshot);
|
|
52
|
+
const out = join(dir, FACTS_FILE);
|
|
53
|
+
const tmp = `${out}.tmp-${process.pid}`;
|
|
54
|
+
writeFileSync(tmp, JSON.stringify(facts, null, 2), 'utf8');
|
|
55
|
+
renameSync(tmp, out);
|
|
56
|
+
return facts;
|
|
57
|
+
}
|
|
58
|
+
function main() {
|
|
59
|
+
try {
|
|
60
|
+
const dir = runDirFrom(process.argv.slice(2), process.env);
|
|
61
|
+
const facts = runAnalyze(dir);
|
|
62
|
+
process.stdout.write(`${summaryOf(facts)}\nwrote ${join(dir, FACTS_FILE)}\n`);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
process.stderr.write(`review analyze failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(resolve(process.argv[1])).href)
|
|
70
|
+
main();
|
|
71
|
+
//# sourceMappingURL=analyze-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-cli.js","sourceRoot":"","sources":["../../src/insights/analyze-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The review's numbers (DES-RUNS-REVIEW-001 §4-§5): a snapshot of {@link RunFact}s in, `facts.json` out. Pure and
|
|
3
|
+
* deterministic. The workflow's `analyze` Tool phase runs it (`analyze-cli.ts`), so every metric, interval and
|
|
4
|
+
* candidate recommendation is computed by code, never by the model. The `interpret` seat only reads the result.
|
|
5
|
+
*/
|
|
6
|
+
import type { RunFact } from './run-facts.js';
|
|
7
|
+
import { type Interval, type Verdict } from './stats.js';
|
|
8
|
+
export declare const FACTS_VERSION = 1;
|
|
9
|
+
/** The most recommendations one review makes; the rest are watched. */
|
|
10
|
+
export declare const MAX_RECOMMENDATIONS = 5;
|
|
11
|
+
/** A single-cause pattern needs this many runs behind it. */
|
|
12
|
+
export declare const PATTERN_MIN_RUNS = 3;
|
|
13
|
+
/** "Working well": a segment's pass rate at or above this, on at least MIN_SAMPLE runs. */
|
|
14
|
+
export declare const WORKING_WELL_RATE = 0.8;
|
|
15
|
+
export interface Window {
|
|
16
|
+
startMs: number;
|
|
17
|
+
endMs: number;
|
|
18
|
+
}
|
|
19
|
+
export interface Snapshot {
|
|
20
|
+
version: 1;
|
|
21
|
+
generatedAtMs: number;
|
|
22
|
+
window: Window;
|
|
23
|
+
/** The previous windows (same length), newest first. Their runs together are the baseline. */
|
|
24
|
+
baselineWindows: Window[];
|
|
25
|
+
projectIds: string[];
|
|
26
|
+
runs: RunFact[];
|
|
27
|
+
}
|
|
28
|
+
export type MetricId = 'pass_rate' | 'override_rate' | 'unresolved_rate' | 'time_to_pr' | 'floor_minutes' | 'wait_on_people' | 'spend' | 'retries';
|
|
29
|
+
export type MetricKind = 'rate' | 'median';
|
|
30
|
+
export interface MetricDef {
|
|
31
|
+
id: MetricId;
|
|
32
|
+
label: string;
|
|
33
|
+
kind: MetricKind;
|
|
34
|
+
unit: 'ratio' | 'minutes' | 'usd' | 'count';
|
|
35
|
+
higherIsBetter: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare const METRICS: readonly MetricDef[];
|
|
38
|
+
export interface SampleStat {
|
|
39
|
+
n: number;
|
|
40
|
+
/** The rate, or the median. `null` with no sample. */
|
|
41
|
+
value: number | null;
|
|
42
|
+
interval: Interval | null;
|
|
43
|
+
p75?: number | null;
|
|
44
|
+
p90?: number | null;
|
|
45
|
+
}
|
|
46
|
+
export interface MetricResult {
|
|
47
|
+
metric: MetricId;
|
|
48
|
+
/** `all`, `repo:<id>`, `agent:<cli>`, `workflow:<id>`. */
|
|
49
|
+
segment: string;
|
|
50
|
+
window: SampleStat;
|
|
51
|
+
baseline: SampleStat;
|
|
52
|
+
verdict: Verdict;
|
|
53
|
+
/** The run ids the window sample counted (evidence). */
|
|
54
|
+
runs: string[];
|
|
55
|
+
}
|
|
56
|
+
export type RecommendationKind = 'steering-rule' | 'memory' | 'setting' | 'issue' | 'resolve-stale';
|
|
57
|
+
export type Confidence = 'high' | 'medium' | 'low';
|
|
58
|
+
export interface EvidenceRun {
|
|
59
|
+
id: string;
|
|
60
|
+
title: string;
|
|
61
|
+
}
|
|
62
|
+
export interface Candidate {
|
|
63
|
+
/** Stable for the same cause: re-derived reviews name the same id. */
|
|
64
|
+
id: string;
|
|
65
|
+
kind: RecommendationKind;
|
|
66
|
+
title: string;
|
|
67
|
+
evidence: {
|
|
68
|
+
line: string;
|
|
69
|
+
runs: EvidenceRun[];
|
|
70
|
+
metric?: MetricId;
|
|
71
|
+
segment?: string;
|
|
72
|
+
n: number;
|
|
73
|
+
value?: number | null;
|
|
74
|
+
baseline?: number | null;
|
|
75
|
+
interval?: Interval | null;
|
|
76
|
+
};
|
|
77
|
+
expectedEffect: string;
|
|
78
|
+
confidence: Confidence;
|
|
79
|
+
changeMind: string;
|
|
80
|
+
/** runs affected + hours at stake + dollars at stake: the ranking key. */
|
|
81
|
+
impact: number;
|
|
82
|
+
/** Why it qualified: a notable change, or a single-cause pattern. */
|
|
83
|
+
basis: 'notable' | 'pattern';
|
|
84
|
+
action: {
|
|
85
|
+
setting?: string;
|
|
86
|
+
issue?: {
|
|
87
|
+
repoRef: string | null;
|
|
88
|
+
title: string;
|
|
89
|
+
body: string;
|
|
90
|
+
};
|
|
91
|
+
runs?: string[];
|
|
92
|
+
proposal?: {
|
|
93
|
+
kindType: string;
|
|
94
|
+
content: string;
|
|
95
|
+
severity?: string;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export interface Finding {
|
|
100
|
+
metric: MetricId;
|
|
101
|
+
segment: string;
|
|
102
|
+
line: string;
|
|
103
|
+
window: SampleStat;
|
|
104
|
+
baseline: SampleStat;
|
|
105
|
+
}
|
|
106
|
+
export interface Facts {
|
|
107
|
+
version: typeof FACTS_VERSION;
|
|
108
|
+
generatedAtMs: number;
|
|
109
|
+
window: Window;
|
|
110
|
+
baselineWindows: Window[];
|
|
111
|
+
projectIds: string[];
|
|
112
|
+
totals: {
|
|
113
|
+
runs: number;
|
|
114
|
+
baselineRuns: number;
|
|
115
|
+
passed: number;
|
|
116
|
+
failed: number;
|
|
117
|
+
cancelled: number;
|
|
118
|
+
open: number;
|
|
119
|
+
spendUsd: number;
|
|
120
|
+
tokens: number;
|
|
121
|
+
};
|
|
122
|
+
minSample: number;
|
|
123
|
+
metrics: MetricResult[];
|
|
124
|
+
/** What got better (a notable improvement) and what is working (a high pass rate on enough runs). */
|
|
125
|
+
improvements: Finding[];
|
|
126
|
+
regressions: Finding[];
|
|
127
|
+
/** Every candidate, ranked by impact (highest first). */
|
|
128
|
+
candidates: Candidate[];
|
|
129
|
+
/** The candidate ids recommended (≤ MAX_RECOMMENDATIONS) and the ones watched. */
|
|
130
|
+
recommended: string[];
|
|
131
|
+
watching: string[];
|
|
132
|
+
}
|
|
133
|
+
export declare function formatValue(def: MetricDef, v: number | null): string;
|
|
134
|
+
export declare function segmentWords(segment: string): string;
|
|
135
|
+
export declare function analyze(snapshot: Snapshot): Facts;
|
|
136
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/insights/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The review's numbers (DES-RUNS-REVIEW-001 §4-§5): a snapshot of {@link RunFact}s in, `facts.json` out. Pure and
|
|
3
|
+
* deterministic. The workflow's `analyze` Tool phase runs it (`analyze-cli.ts`), so every metric, interval and
|
|
4
|
+
* candidate recommendation is computed by code, never by the model. The `interpret` seat only reads the result.
|
|
5
|
+
*/
|
|
6
|
+
import { MIN_SAMPLE, bootstrapMedianCI, compare, percentileSorted, round, seedOf, sortedCopy, wilson } from './stats.js';
|
|
7
|
+
export const FACTS_VERSION = 1;
|
|
8
|
+
/** The most recommendations one review makes; the rest are watched. */
|
|
9
|
+
export const MAX_RECOMMENDATIONS = 5;
|
|
10
|
+
/** A single-cause pattern needs this many runs behind it. */
|
|
11
|
+
export const PATTERN_MIN_RUNS = 3;
|
|
12
|
+
/** "Working well": a segment's pass rate at or above this, on at least MIN_SAMPLE runs. */
|
|
13
|
+
export const WORKING_WELL_RATE = 0.8;
|
|
14
|
+
export const METRICS = [
|
|
15
|
+
{ id: 'pass_rate', label: 'Pass rate', kind: 'rate', unit: 'ratio', higherIsBetter: true },
|
|
16
|
+
{ id: 'override_rate', label: 'Runs with an override', kind: 'rate', unit: 'ratio', higherIsBetter: false },
|
|
17
|
+
{ id: 'unresolved_rate', label: 'Runs left unresolved', kind: 'rate', unit: 'ratio', higherIsBetter: false },
|
|
18
|
+
{ id: 'time_to_pr', label: 'Time to PR', kind: 'median', unit: 'minutes', higherIsBetter: false },
|
|
19
|
+
{ id: 'floor_minutes', label: 'Time in checks', kind: 'median', unit: 'minutes', higherIsBetter: false },
|
|
20
|
+
{ id: 'wait_on_people', label: 'Time waiting on people', kind: 'median', unit: 'minutes', higherIsBetter: false },
|
|
21
|
+
{ id: 'spend', label: 'Spend per run', kind: 'median', unit: 'usd', higherIsBetter: false },
|
|
22
|
+
{ id: 'retries', label: 'Retries per run', kind: 'median', unit: 'count', higherIsBetter: false },
|
|
23
|
+
];
|
|
24
|
+
// ── values per metric ───────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
const MIN = 60_000;
|
|
26
|
+
const terminalOf = (r) => r.outcome !== 'open';
|
|
27
|
+
/** The runs a metric samples, and each run's value (a rate's value is 1 or 0). */
|
|
28
|
+
function sampleOf(metric, runs) {
|
|
29
|
+
const pick = (keep, value) => {
|
|
30
|
+
const kept = runs.filter(keep);
|
|
31
|
+
return { ids: kept.map((r) => r.id), values: kept.map(value) };
|
|
32
|
+
};
|
|
33
|
+
switch (metric) {
|
|
34
|
+
case 'pass_rate':
|
|
35
|
+
// Cancelled is a person's decision, not a failure: the rate is passed / (passed + failed).
|
|
36
|
+
return pick((r) => r.outcome === 'passed' || r.outcome === 'failed', (r) => (r.outcome === 'passed' ? 1 : 0));
|
|
37
|
+
case 'override_rate':
|
|
38
|
+
return pick(terminalOf, (r) => (r.overrides.length > 0 ? 1 : 0));
|
|
39
|
+
case 'unresolved_rate':
|
|
40
|
+
return pick(() => true, (r) => (r.unresolved ? 1 : 0));
|
|
41
|
+
case 'time_to_pr':
|
|
42
|
+
return pick((r) => r.timeToPrMs !== null, (r) => r.timeToPrMs / MIN);
|
|
43
|
+
case 'floor_minutes':
|
|
44
|
+
return pick((r) => terminalOf(r) && r.floorMs > 0, (r) => r.floorMs / MIN);
|
|
45
|
+
case 'wait_on_people':
|
|
46
|
+
return pick(terminalOf, (r) => r.waitHumanMs / MIN);
|
|
47
|
+
case 'spend':
|
|
48
|
+
return pick((r) => r.spendReported, (r) => r.spendUsd);
|
|
49
|
+
case 'retries':
|
|
50
|
+
return pick(terminalOf, (r) => r.retries);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function statOf(def, values, seedLabel) {
|
|
54
|
+
const n = values.length;
|
|
55
|
+
if (def.kind === 'rate') {
|
|
56
|
+
const successes = values.reduce((a, b) => a + b, 0);
|
|
57
|
+
return { n, value: n === 0 ? null : round(successes / n), interval: roundInterval(wilson(successes, n)) };
|
|
58
|
+
}
|
|
59
|
+
const sorted = sortedCopy(values);
|
|
60
|
+
return {
|
|
61
|
+
n,
|
|
62
|
+
value: round(percentileSorted(sorted, 0.5)),
|
|
63
|
+
interval: roundInterval(bootstrapMedianCI(values, seedOf(seedLabel))),
|
|
64
|
+
p75: round(percentileSorted(sorted, 0.75)),
|
|
65
|
+
p90: round(percentileSorted(sorted, 0.9)),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function roundInterval(i) {
|
|
69
|
+
return i === null ? null : { lo: round(i.lo), hi: round(i.hi) };
|
|
70
|
+
}
|
|
71
|
+
/** Segments: everything, then each repo, agent and workflow seen in the window. */
|
|
72
|
+
function segmentsOf(runs) {
|
|
73
|
+
const out = [{ segment: 'all', keep: () => true }];
|
|
74
|
+
const repos = [...new Set(runs.map((r) => r.repo).filter((x) => x !== null))].sort();
|
|
75
|
+
const agents = [...new Set(runs.flatMap((r) => r.agents))].sort();
|
|
76
|
+
const workflows = [...new Set(runs.map((r) => r.workflow))].sort();
|
|
77
|
+
for (const repo of repos)
|
|
78
|
+
out.push({ segment: `repo:${repo}`, keep: (r) => r.repo === repo });
|
|
79
|
+
for (const agent of agents)
|
|
80
|
+
out.push({ segment: `agent:${agent}`, keep: (r) => r.agents.includes(agent) });
|
|
81
|
+
for (const wf of workflows)
|
|
82
|
+
out.push({ segment: `workflow:${wf}`, keep: (r) => r.workflow === wf });
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
const inWindow = (w) => (r) => r.createdAtMs >= w.startMs && r.createdAtMs < w.endMs;
|
|
86
|
+
// ── words ───────────────────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
export function formatValue(def, v) {
|
|
88
|
+
if (v === null)
|
|
89
|
+
return 'none';
|
|
90
|
+
switch (def.unit) {
|
|
91
|
+
case 'ratio': return `${Math.round(v * 100)}%`;
|
|
92
|
+
case 'minutes': return v >= 120 ? `${(v / 60).toFixed(1)} h` : `${Math.round(v)} min`;
|
|
93
|
+
case 'usd': return `$${v.toFixed(2)}`;
|
|
94
|
+
case 'count': return v.toFixed(v % 1 === 0 ? 0 : 1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function segmentWords(segment) {
|
|
98
|
+
if (segment === 'all')
|
|
99
|
+
return 'all runs';
|
|
100
|
+
const [k, ...rest] = segment.split(':');
|
|
101
|
+
const v = rest.join(':');
|
|
102
|
+
return k === 'repo' ? `${v} runs` : k === 'agent' ? `runs ${v} worked on` : `${v} runs`;
|
|
103
|
+
}
|
|
104
|
+
function findingLine(def, r) {
|
|
105
|
+
const w = r.window;
|
|
106
|
+
const ci = w.interval !== null ? ` (95% CI ${formatValue(def, w.interval.lo)}–${formatValue(def, w.interval.hi)})` : '';
|
|
107
|
+
return `${def.label}, ${segmentWords(r.segment)}: ${formatValue(def, w.value)}${ci}, n=${w.n}, against ${formatValue(def, r.baseline.value)} before (n=${r.baseline.n}).`;
|
|
108
|
+
}
|
|
109
|
+
function confidenceOf(n, basis) {
|
|
110
|
+
if (basis === 'notable')
|
|
111
|
+
return n >= 15 ? 'high' : n >= 8 ? 'medium' : 'low';
|
|
112
|
+
return n >= 6 ? 'high' : n >= 4 ? 'medium' : 'low';
|
|
113
|
+
}
|
|
114
|
+
const hours = (ms) => ms / 3_600_000;
|
|
115
|
+
const ev = (runs) => runs.map((r) => ({ id: r.id, title: r.title }));
|
|
116
|
+
const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 60);
|
|
117
|
+
// ── candidates ──────────────────────────────────────────────────────────────────────────────────────
|
|
118
|
+
function patternCandidates(runs, nowMs) {
|
|
119
|
+
const out = [];
|
|
120
|
+
// 1. Unresolved runs: "resolve these N stale runs".
|
|
121
|
+
const stale = runs.filter((r) => r.unresolved);
|
|
122
|
+
if (stale.length >= PATTERN_MIN_RUNS) {
|
|
123
|
+
const openHours = stale.reduce((a, r) => a + hours(Math.max(0, (r.endedAtMs ?? nowMs) - r.createdAtMs)), 0);
|
|
124
|
+
out.push({
|
|
125
|
+
id: 'resolve-stale',
|
|
126
|
+
kind: 'resolve-stale',
|
|
127
|
+
title: `Resolve ${stale.length} runs nobody closed`,
|
|
128
|
+
evidence: { line: `${stale.length} runs failed or sat open over a day and were neither retried nor archived.`, runs: ev(stale), n: stale.length },
|
|
129
|
+
expectedEffect: 'The run list shows only live work, and the work these runs held is either finished or written off.',
|
|
130
|
+
confidence: confidenceOf(stale.length, 'pattern'),
|
|
131
|
+
changeMind: 'If these runs are deliberately parked (waiting on an outside answer), archive them with a note instead.',
|
|
132
|
+
impact: round(stale.length + Math.min(openHours, 72), 2),
|
|
133
|
+
basis: 'pattern',
|
|
134
|
+
action: { runs: stale.map((r) => r.id) },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// 2. The same override, again and again, on one repo.
|
|
138
|
+
const overrideGroups = new Map();
|
|
139
|
+
for (const r of runs) {
|
|
140
|
+
for (const cond of new Set(r.overrides.map((o) => o.condition))) {
|
|
141
|
+
const key = `${r.repo ?? '-'}\u0000${cond}`;
|
|
142
|
+
overrideGroups.set(key, [...(overrideGroups.get(key) ?? []), r]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const [key, group] of [...overrideGroups.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
146
|
+
if (group.length < PATTERN_MIN_RUNS)
|
|
147
|
+
continue;
|
|
148
|
+
const [repoKey, condition] = key.split('\u0000');
|
|
149
|
+
const repo = repoKey === '-' ? null : repoKey;
|
|
150
|
+
const where = repo ?? 'repo-less runs';
|
|
151
|
+
const waited = group.reduce((a, r) => a + hours(r.waitHumanMs), 0);
|
|
152
|
+
const base = {
|
|
153
|
+
evidence: { line: `A "${condition}" escalation was overridden by a person in ${group.length} runs on ${where}.`, runs: ev(group), n: group.length },
|
|
154
|
+
confidence: confidenceOf(group.length, 'pattern'),
|
|
155
|
+
impact: round(group.length + waited, 2),
|
|
156
|
+
basis: 'pattern',
|
|
157
|
+
};
|
|
158
|
+
if (condition === 'judge_unavailable') {
|
|
159
|
+
out.push({
|
|
160
|
+
...base,
|
|
161
|
+
id: `setting-judge-${slug(where)}`,
|
|
162
|
+
kind: 'setting',
|
|
163
|
+
title: 'Sign in a second agent so a distinct judge can review',
|
|
164
|
+
expectedEffect: 'Reviews run on a seat other than the creator\'s, so a person stops overriding "no judge" by hand.',
|
|
165
|
+
changeMind: 'If a second agent is signed in and still benched, the cause is its quota or sign-in, not the roster.',
|
|
166
|
+
action: { setting: 'seats' },
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else if (condition === 'floor_failed') {
|
|
170
|
+
const title = `Checks on ${where} fail before the change: ${group.length} runs overrode them`;
|
|
171
|
+
out.push({
|
|
172
|
+
...base,
|
|
173
|
+
id: `issue-floor-${slug(where)}`,
|
|
174
|
+
kind: 'issue',
|
|
175
|
+
title: `Fix the checks that fail on ${where}`,
|
|
176
|
+
expectedEffect: 'Runs pass their checks on merit, and overrides stop hiding real failures.',
|
|
177
|
+
changeMind: 'If the failing checks pass on CI, the cause is this machine\'s environment: file that instead.',
|
|
178
|
+
action: { issue: { repoRef: repo, title, body: `${base.evidence.line}\n\nRuns: ${group.map((r) => r.id).join(', ')}` } },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
const statement = `On ${where}, a "${condition}" escalation was overridden in ${group.length} runs. Plans for ${where} should state how they meet "${condition}" before the gate runs.`;
|
|
183
|
+
out.push({
|
|
184
|
+
...base,
|
|
185
|
+
id: `steering-override-${slug(where)}-${slug(condition)}`,
|
|
186
|
+
kind: 'steering-rule',
|
|
187
|
+
title: `Make plans on ${where} answer "${condition}" up front`,
|
|
188
|
+
expectedEffect: 'Fewer gates escalate on this condition, so fewer runs wait on a person to override them.',
|
|
189
|
+
changeMind: 'If the overrides were each for a different reason, a rule would not help: dismiss with that reason.',
|
|
190
|
+
action: { proposal: { kindType: 'policy:operations', content: statement, severity: 'warn' } },
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// 3. A seat benched for the same reason across runs.
|
|
195
|
+
const benchGroups = new Map();
|
|
196
|
+
for (const r of runs)
|
|
197
|
+
for (const b of r.benched) {
|
|
198
|
+
// The reason without its parenthetical detail ("quota_exhausted (no success in the run)" → "quota_exhausted").
|
|
199
|
+
const key = `${b.cli}\u0000${(b.reason.split(' (')[0] ?? b.reason).trim().slice(0, 60)}`;
|
|
200
|
+
benchGroups.set(key, [...(benchGroups.get(key) ?? []), r]);
|
|
201
|
+
}
|
|
202
|
+
for (const [key, group] of [...benchGroups.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
203
|
+
if (group.length < PATTERN_MIN_RUNS)
|
|
204
|
+
continue;
|
|
205
|
+
const [cli, reason] = key.split('\u0000');
|
|
206
|
+
const signin = /not_logged_in|signed/u.test(reason);
|
|
207
|
+
out.push({
|
|
208
|
+
id: `setting-bench-${slug(cli)}-${slug(reason)}`,
|
|
209
|
+
kind: 'setting',
|
|
210
|
+
title: signin ? `Sign ${cli} back in` : `Check why ${cli} is benched: ${reason.replace(/_/g, ' ')}`,
|
|
211
|
+
evidence: { line: `${cli} was benched (${reason.replace(/_/g, ' ')}) in ${group.length} runs.`, runs: ev(group), n: group.length },
|
|
212
|
+
expectedEffect: `${cli} takes work again, so runs have more distinct seats and fewer fallbacks.`,
|
|
213
|
+
confidence: confidenceOf(group.length, 'pattern'),
|
|
214
|
+
changeMind: `If ${cli} is benched on purpose, remove it from the roster so runs stop trying it.`,
|
|
215
|
+
impact: group.length,
|
|
216
|
+
basis: 'pattern',
|
|
217
|
+
action: { setting: 'seats' },
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// 4. The same failure, again and again.
|
|
221
|
+
const failGroups = new Map();
|
|
222
|
+
for (const r of runs)
|
|
223
|
+
if (r.failureSignature !== null) {
|
|
224
|
+
const key = `${r.repo ?? '-'}\u0000${r.failureSignature}`;
|
|
225
|
+
failGroups.set(key, [...(failGroups.get(key) ?? []), r]);
|
|
226
|
+
}
|
|
227
|
+
for (const [key, group] of [...failGroups.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
228
|
+
if (group.length < PATTERN_MIN_RUNS)
|
|
229
|
+
continue;
|
|
230
|
+
const [repoKey, signature] = key.split('\u0000');
|
|
231
|
+
const repo = repoKey === '-' ? null : repoKey;
|
|
232
|
+
const spent = group.reduce((a, r) => a + r.spendUsd, 0);
|
|
233
|
+
const title = `${group.length} runs on ${repo ?? 'repo-less work'} failed the same way: ${signature}`;
|
|
234
|
+
out.push({
|
|
235
|
+
id: `issue-failure-${slug(repo ?? 'none')}-${slug(signature)}`,
|
|
236
|
+
kind: 'issue',
|
|
237
|
+
title: `File the failure behind ${group.length} runs on ${repo ?? 'repo-less work'}`,
|
|
238
|
+
evidence: { line: `${title}.`, runs: ev(group), n: group.length },
|
|
239
|
+
expectedEffect: 'One fix stops a whole class of failed runs and the spend they burn.',
|
|
240
|
+
confidence: confidenceOf(group.length, 'pattern'),
|
|
241
|
+
changeMind: 'If the runs share the words but not the cause, split the issue per cause.',
|
|
242
|
+
impact: round(group.length + spent, 2),
|
|
243
|
+
basis: 'pattern',
|
|
244
|
+
action: { issue: { repoRef: repo, title, body: `Runs: ${group.map((r) => r.id).join(', ')}\nSpend: $${spent.toFixed(2)}` } },
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return out;
|
|
248
|
+
}
|
|
249
|
+
function regressionCandidates(regressions, runs) {
|
|
250
|
+
const out = [];
|
|
251
|
+
// A segment that counted exactly the runs a broader segment did says the same thing twice: keep the first
|
|
252
|
+
// (`all` comes first, then repo, agent, workflow).
|
|
253
|
+
// One recommendation per regressed metric: the broadest segment that regressed (`all`, then repo, agent,
|
|
254
|
+
// workflow). The narrower ones stay listed as regressions; three cards for one cause would crowd out others.
|
|
255
|
+
const seen = new Set();
|
|
256
|
+
for (const r of regressions) {
|
|
257
|
+
if (seen.has(r.metric))
|
|
258
|
+
continue;
|
|
259
|
+
seen.add(r.metric);
|
|
260
|
+
const def = METRICS.find((m) => m.id === r.metric);
|
|
261
|
+
const members = runs.filter((x) => r.runs.includes(x.id));
|
|
262
|
+
const n = r.window.n;
|
|
263
|
+
const gap = Math.abs((r.window.value ?? 0) - (r.baseline.value ?? 0));
|
|
264
|
+
const stakeHours = def.unit === 'minutes' ? (gap * n) / 60 : 0;
|
|
265
|
+
const stakeUsd = def.unit === 'usd' ? gap * n : 0;
|
|
266
|
+
const repo = r.segment.startsWith('repo:') ? r.segment.slice(5) : null;
|
|
267
|
+
const line = findingLine(def, r);
|
|
268
|
+
const setting = r.metric === 'wait_on_people' ? 'gates' : r.segment.startsWith('agent:') ? 'seats' : null;
|
|
269
|
+
const title = `${def.label} got worse for ${segmentWords(r.segment)}`;
|
|
270
|
+
out.push({
|
|
271
|
+
id: `regression-${r.metric}-${slug(r.segment)}`,
|
|
272
|
+
kind: setting !== null ? 'setting' : 'issue',
|
|
273
|
+
title,
|
|
274
|
+
evidence: { line, runs: ev(members), metric: r.metric, segment: r.segment, n, value: r.window.value, baseline: r.baseline.value, interval: r.window.interval },
|
|
275
|
+
expectedEffect: `${def.label} returns toward ${formatValue(def, r.baseline.value)} for ${segmentWords(r.segment)}.`,
|
|
276
|
+
confidence: confidenceOf(n, 'notable'),
|
|
277
|
+
changeMind: 'If the work itself changed (bigger tasks in this window), the baseline is not comparable: watch one more window.',
|
|
278
|
+
impact: round(n + stakeHours + stakeUsd, 2),
|
|
279
|
+
basis: 'notable',
|
|
280
|
+
action: setting !== null ? { setting } : { issue: { repoRef: repo, title, body: line } },
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
// ── the analysis ────────────────────────────────────────────────────────────────────────────────────
|
|
286
|
+
export function analyze(snapshot) {
|
|
287
|
+
const windowRuns = snapshot.runs.filter(inWindow(snapshot.window));
|
|
288
|
+
const baselineRuns = snapshot.runs.filter((r) => snapshot.baselineWindows.some((w) => inWindow(w)(r)));
|
|
289
|
+
const metrics = [];
|
|
290
|
+
for (const seg of segmentsOf(windowRuns)) {
|
|
291
|
+
const w = windowRuns.filter(seg.keep);
|
|
292
|
+
const b = baselineRuns.filter(seg.keep);
|
|
293
|
+
for (const def of METRICS) {
|
|
294
|
+
const ws = sampleOf(def.id, w);
|
|
295
|
+
const bs = sampleOf(def.id, b);
|
|
296
|
+
if (ws.values.length === 0 && bs.values.length === 0)
|
|
297
|
+
continue;
|
|
298
|
+
const window = statOf(def, ws.values, `${def.id}|${seg.segment}|window`);
|
|
299
|
+
const baseline = statOf(def, bs.values, `${def.id}|${seg.segment}|baseline`);
|
|
300
|
+
metrics.push({
|
|
301
|
+
metric: def.id,
|
|
302
|
+
segment: seg.segment,
|
|
303
|
+
window,
|
|
304
|
+
baseline,
|
|
305
|
+
verdict: compare(window.n, window.interval, baseline.n, baseline.value, def.higherIsBetter),
|
|
306
|
+
runs: ws.ids,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const defOf = (id) => METRICS.find((m) => m.id === id);
|
|
311
|
+
const finding = (r) => ({ metric: r.metric, segment: r.segment, line: findingLine(defOf(r.metric), r), window: r.window, baseline: r.baseline });
|
|
312
|
+
// A segment that counted exactly the runs a broader one did says the same thing twice: keep the broader one.
|
|
313
|
+
const distinct = (ms) => {
|
|
314
|
+
const seen = new Set();
|
|
315
|
+
return ms.filter((m) => {
|
|
316
|
+
const key = `${m.metric}\u0000${[...m.runs].sort().join(',')}`;
|
|
317
|
+
if (seen.has(key))
|
|
318
|
+
return false;
|
|
319
|
+
seen.add(key);
|
|
320
|
+
return true;
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
const improved = distinct(metrics.filter((m) => m.verdict === 'improved'));
|
|
324
|
+
const regressed = distinct(metrics.filter((m) => m.verdict === 'regressed'));
|
|
325
|
+
const working = distinct(metrics.filter((m) => m.metric === 'pass_rate' && m.verdict !== 'improved' && m.window.n >= MIN_SAMPLE && (m.window.value ?? 0) >= WORKING_WELL_RATE));
|
|
326
|
+
const improvements = [
|
|
327
|
+
...improved.map(finding),
|
|
328
|
+
...working.map((m) => ({ ...finding(m), line: `Working well: ${segmentWords(m.segment)} passed ${formatValue(defOf('pass_rate'), m.window.value)} of the time (n=${m.window.n}).` })),
|
|
329
|
+
];
|
|
330
|
+
const candidates = [...patternCandidates(windowRuns, snapshot.generatedAtMs), ...regressionCandidates(regressed, windowRuns)]
|
|
331
|
+
.sort((a, b) => b.impact - a.impact || a.id.localeCompare(b.id));
|
|
332
|
+
const sum = (f) => windowRuns.reduce((a, r) => a + f(r), 0);
|
|
333
|
+
return {
|
|
334
|
+
version: FACTS_VERSION,
|
|
335
|
+
generatedAtMs: snapshot.generatedAtMs,
|
|
336
|
+
window: snapshot.window,
|
|
337
|
+
baselineWindows: snapshot.baselineWindows,
|
|
338
|
+
projectIds: snapshot.projectIds,
|
|
339
|
+
totals: {
|
|
340
|
+
runs: windowRuns.length,
|
|
341
|
+
baselineRuns: baselineRuns.length,
|
|
342
|
+
passed: windowRuns.filter((r) => r.outcome === 'passed').length,
|
|
343
|
+
failed: windowRuns.filter((r) => r.outcome === 'failed').length,
|
|
344
|
+
cancelled: windowRuns.filter((r) => r.outcome === 'cancelled').length,
|
|
345
|
+
open: windowRuns.filter((r) => r.outcome === 'open').length,
|
|
346
|
+
spendUsd: round(sum((r) => r.spendUsd), 2),
|
|
347
|
+
tokens: sum((r) => r.tokens),
|
|
348
|
+
},
|
|
349
|
+
minSample: MIN_SAMPLE,
|
|
350
|
+
metrics,
|
|
351
|
+
improvements,
|
|
352
|
+
regressions: regressed.map(finding),
|
|
353
|
+
candidates,
|
|
354
|
+
recommended: candidates.slice(0, MAX_RECOMMENDATIONS).map((c) => c.id),
|
|
355
|
+
watching: candidates.slice(MAX_RECOMMENDATIONS).map((c) => c.id),
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/insights/analyze.ts"],"names":[],"mappings":"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"}
|