mister-wolf 2.6.1 → 2.8.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/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +6 -9
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/analytics.d.ts +1 -1
- package/dist/adapters/cli/commands/analytics.d.ts.map +1 -1
- package/dist/adapters/cli/commands/analytics.js +71 -1
- package/dist/adapters/cli/commands/analytics.js.map +1 -1
- package/dist/adapters/cli/commands/coord.d.ts +3 -0
- package/dist/adapters/cli/commands/coord.d.ts.map +1 -0
- package/dist/adapters/cli/commands/coord.js +36 -0
- package/dist/adapters/cli/commands/coord.js.map +1 -0
- package/dist/adapters/cli/commands/memory-brief.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-brief.js +16 -0
- package/dist/adapters/cli/commands/memory-brief.js.map +1 -1
- package/dist/adapters/cli/commands/memory-call.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-call.js +16 -2
- package/dist/adapters/cli/commands/memory-call.js.map +1 -1
- package/dist/adapters/cli/commands/memory-get.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-get.js +18 -0
- package/dist/adapters/cli/commands/memory-get.js.map +1 -1
- package/dist/adapters/cli/commands/memory-run.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-run.js +2 -0
- package/dist/adapters/cli/commands/memory-run.js.map +1 -1
- package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-search.js +16 -0
- package/dist/adapters/cli/commands/memory-search.js.map +1 -1
- package/dist/adapters/cli/commands/memory-stage.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-stage.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-stage.js +35 -0
- package/dist/adapters/cli/commands/memory-stage.js.map +1 -0
- package/dist/adapters/cli/commands/task-eval.d.ts.map +1 -1
- package/dist/adapters/cli/commands/task-eval.js +2 -0
- package/dist/adapters/cli/commands/task-eval.js.map +1 -1
- package/dist/adapters/fs/session-metrics-log.d.ts +63 -1
- package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
- package/dist/adapters/fs/session-metrics-log.js +67 -1
- package/dist/adapters/fs/session-metrics-log.js.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.d.ts +2 -0
- package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.js +2 -0
- package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
- package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-tools.js +45 -3
- package/dist/adapters/mcp/mcp-tools.js.map +1 -1
- package/dist/adapters/version.d.ts +3 -0
- package/dist/adapters/version.d.ts.map +1 -0
- package/dist/adapters/version.js +12 -0
- package/dist/adapters/version.js.map +1 -0
- package/dist/app/use-cases/build-analytics.d.ts +108 -1
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +329 -3
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.d.ts +2 -0
- package/dist/app/use-cases/generate-agent-brief.d.ts.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.js +1 -1
- package/dist/app/use-cases/generate-agent-brief.js.map +1 -1
- package/dist/domain/actor.d.ts +3 -0
- package/dist/domain/actor.d.ts.map +1 -1
- package/dist/domain/actor.js +6 -0
- package/dist/domain/actor.js.map +1 -1
- package/package.json +1 -1
|
@@ -104,6 +104,97 @@ export interface CoverageStats {
|
|
|
104
104
|
runs: number;
|
|
105
105
|
scoredTaskRatePct: number | null;
|
|
106
106
|
}
|
|
107
|
+
/** P2 D4: счётчик стадии — события + уникальные memory_ids. */
|
|
108
|
+
export interface StageCount {
|
|
109
|
+
events: number;
|
|
110
|
+
uniqueIds: number;
|
|
111
|
+
}
|
|
112
|
+
/** P2 D4: воронка added→retrieved→injected→cited→applied. */
|
|
113
|
+
export interface MemoryLifecycleFunnel {
|
|
114
|
+
added: number;
|
|
115
|
+
retrieved: StageCount;
|
|
116
|
+
injected: StageCount;
|
|
117
|
+
cited: StageCount;
|
|
118
|
+
applied: StageCount;
|
|
119
|
+
/** Уникальные id, доходившие до applied (D4), отсортирован. */
|
|
120
|
+
appliedUniqueIds: string[];
|
|
121
|
+
}
|
|
122
|
+
/** P2 D4: атрибуция — доля accepted-вердиктов с предшествующей инъекцией в сессии. */
|
|
123
|
+
export interface AttributionCoverage {
|
|
124
|
+
acceptedTotal: number;
|
|
125
|
+
acceptedWithInjection: number;
|
|
126
|
+
attributionCoveragePct: number | null;
|
|
127
|
+
/** При pct === null: 'no task_evaluated' | 'no injected' | 'no accepted verdicts'. */
|
|
128
|
+
reason?: string;
|
|
129
|
+
}
|
|
130
|
+
/** P3 D2: порог когорты — n < MIN_COHORT_N → метрики n/a с reason (паттерн честных null). */
|
|
131
|
+
export declare const MIN_COHORT_N = 3;
|
|
132
|
+
export interface CampaignCohort {
|
|
133
|
+
cohort: 'with_memory' | 'no_memory';
|
|
134
|
+
n: number;
|
|
135
|
+
/** Медиана weighted ранов когорты; null при n < MIN_COHORT_N или n = 0. */
|
|
136
|
+
medianWeighted: number | null;
|
|
137
|
+
/** Доля accepted среди вердиктов когорты, %; null — вердиктов в когорте нет. */
|
|
138
|
+
acceptedSharePct: number | null;
|
|
139
|
+
/** (раны с outcome !== 'ok') / n, %; null при n = 0. */
|
|
140
|
+
processFailureRatePct: number | null;
|
|
141
|
+
/** 'n<3: min 3 runs' | 'no runs' | null (n>=3 и раны есть). */
|
|
142
|
+
reason: string | null;
|
|
143
|
+
}
|
|
144
|
+
export interface CampaignRow {
|
|
145
|
+
campaign: string;
|
|
146
|
+
runs: number;
|
|
147
|
+
/** false → у кампании нет ни одного task_evaluated с detail.campaign_id === C (вердикт-колонки n/a). */
|
|
148
|
+
hasVerdicts: boolean;
|
|
149
|
+
withMemory: CampaignCohort;
|
|
150
|
+
noMemory: CampaignCohort;
|
|
151
|
+
}
|
|
152
|
+
export interface CampaignView {
|
|
153
|
+
/** sort: runs убыв., затем campaign по алфавиту. */
|
|
154
|
+
rows: CampaignRow[];
|
|
155
|
+
}
|
|
156
|
+
/** P3 D3: per-memory ROI — корреляционная витрина (не причинность). */
|
|
157
|
+
export interface MemoryRoiRow {
|
|
158
|
+
id: string;
|
|
159
|
+
/** accepted task_evaluated в сессиях, где этот id инъецировался не позже вердикта (ts injected <= ts verdict). */
|
|
160
|
+
associatedAccepted: number;
|
|
161
|
+
/** applied-события этого id (число событий). */
|
|
162
|
+
associatedApplied: number;
|
|
163
|
+
/** injected-события этого id (число событий). */
|
|
164
|
+
injectedTotal: number;
|
|
165
|
+
/** max ts среди injected/applied-событий id; нет событий — null (практически не бывает: строка создаётся по injected). */
|
|
166
|
+
lastActivity: string | null;
|
|
167
|
+
}
|
|
168
|
+
export interface MemoryRoi {
|
|
169
|
+
/** sort: associatedAccepted убыв., затем injectedTotal убыв., затем id по алфавиту. */
|
|
170
|
+
rows: MemoryRoiRow[];
|
|
171
|
+
}
|
|
172
|
+
/** P2 D5: координационное view. */
|
|
173
|
+
export interface CoordinationCount {
|
|
174
|
+
kind: string;
|
|
175
|
+
actorFrom: string;
|
|
176
|
+
count: number;
|
|
177
|
+
}
|
|
178
|
+
export interface CoordinationRecentEvent {
|
|
179
|
+
ts: string;
|
|
180
|
+
kind: string;
|
|
181
|
+
from: string;
|
|
182
|
+
to: string | null;
|
|
183
|
+
refs: string[];
|
|
184
|
+
}
|
|
185
|
+
export interface CoordinationBlockerPair {
|
|
186
|
+
ref: string;
|
|
187
|
+
openedAt: string;
|
|
188
|
+
resolvedAt: string | null;
|
|
189
|
+
}
|
|
190
|
+
export interface CoordinationView {
|
|
191
|
+
/** kind × actor_from; sort: count убыв., потом kind, потом actorFrom. */
|
|
192
|
+
counts: CoordinationCount[];
|
|
193
|
+
/** Последние 20 по ts, свежие первыми. */
|
|
194
|
+
recent: CoordinationRecentEvent[];
|
|
195
|
+
/** По refs coord_event kind=blocker, sort по ref. */
|
|
196
|
+
blockers: CoordinationBlockerPair[];
|
|
197
|
+
}
|
|
107
198
|
/** D7: data-quality сигнального лога (битые строки не роняют контур — только метрика). */
|
|
108
199
|
export interface DataQualityStats {
|
|
109
200
|
validEventRatePct: number | null;
|
|
@@ -195,6 +286,10 @@ export interface AnalyticsReport {
|
|
|
195
286
|
memory: {
|
|
196
287
|
rows: MemoryLedgerRow[];
|
|
197
288
|
garbage: GarbageStats;
|
|
289
|
+
funnel: MemoryLifecycleFunnel;
|
|
290
|
+
attribution: AttributionCoverage;
|
|
291
|
+
/** P3 D3: per-memory ROI (расширение memory-блока). */
|
|
292
|
+
roi: MemoryRoi;
|
|
198
293
|
};
|
|
199
294
|
tools: ToolLedgerRow[];
|
|
200
295
|
rules: RuleRankingRow[];
|
|
@@ -204,6 +299,9 @@ export interface AnalyticsReport {
|
|
|
204
299
|
steward: StewardView;
|
|
205
300
|
readiness: ExperimentReadiness;
|
|
206
301
|
councils: CouncilsView;
|
|
302
|
+
coordination: CoordinationView;
|
|
303
|
+
/** P3 D2: витрина кампаний (когорты with/no memory). */
|
|
304
|
+
campaign: CampaignView;
|
|
207
305
|
acceptance: AcceptanceStats;
|
|
208
306
|
coverage: CoverageStats;
|
|
209
307
|
dataQuality: DataQualityStats;
|
|
@@ -234,7 +332,7 @@ export interface AnalyticsInput {
|
|
|
234
332
|
*/
|
|
235
333
|
export declare function buildAnalyticsReport(deps: AnalyticsDeps, input: AnalyticsInput): Promise<AnalyticsReport>;
|
|
236
334
|
export interface AnalyticsViewFilter {
|
|
237
|
-
view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'all';
|
|
335
|
+
view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'coordination' | 'campaign' | 'all';
|
|
238
336
|
class?: 'new' | 'sleeper' | 'workhorse' | 'dead';
|
|
239
337
|
type?: string;
|
|
240
338
|
origin?: 'script' | 'model-native';
|
|
@@ -246,6 +344,9 @@ export type AnalyticsViewPayload = {
|
|
|
246
344
|
view: 'memory';
|
|
247
345
|
rows: MemoryLedgerRow[];
|
|
248
346
|
garbage: GarbageStats;
|
|
347
|
+
funnel: MemoryLifecycleFunnel;
|
|
348
|
+
attribution: AttributionCoverage;
|
|
349
|
+
roi: MemoryRoi;
|
|
249
350
|
} | {
|
|
250
351
|
view: 'tools';
|
|
251
352
|
rows: ToolLedgerRow[];
|
|
@@ -270,6 +371,12 @@ export type AnalyticsViewPayload = {
|
|
|
270
371
|
} | {
|
|
271
372
|
view: 'councils';
|
|
272
373
|
councils: CouncilsView;
|
|
374
|
+
} | {
|
|
375
|
+
view: 'coordination';
|
|
376
|
+
coordination: CoordinationView;
|
|
377
|
+
} | {
|
|
378
|
+
view: 'campaign';
|
|
379
|
+
campaign: CampaignView;
|
|
273
380
|
} | {
|
|
274
381
|
view: 'all';
|
|
275
382
|
report: AnalyticsReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-analytics.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/build-analytics.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build-analytics.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/build-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,9 @@ export function classifyLifecycle(uses, ageDays, t) {
|
|
|
18
18
|
return 'sleeper';
|
|
19
19
|
return ageDays <= t.newDays ? 'new' : 'dead';
|
|
20
20
|
}
|
|
21
|
+
// --- P3 D2/D3: кампании (когорты с памятью/без) и per-memory ROI ---
|
|
22
|
+
/** P3 D2: порог когорты — n < MIN_COHORT_N → метрики n/a с reason (паттерн честных null). */
|
|
23
|
+
export const MIN_COHORT_N = 3;
|
|
21
24
|
// ---------------------------------------------------------------------------
|
|
22
25
|
// Внутренние хелперы
|
|
23
26
|
// ---------------------------------------------------------------------------
|
|
@@ -25,7 +28,8 @@ export function classifyLifecycle(uses, ageDays, t) {
|
|
|
25
28
|
function finiteNumber(value) {
|
|
26
29
|
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
27
30
|
}
|
|
28
|
-
/** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7.
|
|
31
|
+
/** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7.
|
|
32
|
+
* (funnel/attribution добавляет вызов buildAnalyticsReport — P2 D4.) */
|
|
29
33
|
function buildMemoryLedger(objects, events, signals, now, t) {
|
|
30
34
|
const rows = [];
|
|
31
35
|
for (const o of objects) {
|
|
@@ -302,6 +306,305 @@ function buildCoverage(signals) {
|
|
|
302
306
|
const runs = signals.filter((s) => s.event === 'run').length;
|
|
303
307
|
return { scored, runs, scoredTaskRatePct: runs > 0 ? (scored / runs) * 100 : null };
|
|
304
308
|
}
|
|
309
|
+
/** Валидный memory_stage-сигнал (D4 guard): detail есть, stage — одна из четырёх,
|
|
310
|
+
* memory_ids — массив непустых строк (≥1); малформ → null, отчёт не роняет. */
|
|
311
|
+
function memoryStageOf(s) {
|
|
312
|
+
if (s.event !== 'memory_stage')
|
|
313
|
+
return null;
|
|
314
|
+
const d = s.detail;
|
|
315
|
+
if (d === undefined)
|
|
316
|
+
return null;
|
|
317
|
+
const stage = d.stage;
|
|
318
|
+
if (stage !== 'retrieved' && stage !== 'injected' && stage !== 'cited' && stage !== 'applied') {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
if (!Array.isArray(d.memory_ids))
|
|
322
|
+
return null;
|
|
323
|
+
const ids = d.memory_ids.filter((id) => typeof id === 'string' && id !== '');
|
|
324
|
+
return ids.length > 0 ? { stage, ids } : null;
|
|
325
|
+
}
|
|
326
|
+
/** Воронка D4: added = все объекты store; стадии — события + уникальные memory_ids. */
|
|
327
|
+
function buildLifecycleFunnel(added, signals) {
|
|
328
|
+
const acc = {
|
|
329
|
+
retrieved: { events: 0, ids: new Set() },
|
|
330
|
+
injected: { events: 0, ids: new Set() },
|
|
331
|
+
cited: { events: 0, ids: new Set() },
|
|
332
|
+
applied: { events: 0, ids: new Set() },
|
|
333
|
+
};
|
|
334
|
+
for (const s of signals) {
|
|
335
|
+
const st = memoryStageOf(s);
|
|
336
|
+
if (st === null)
|
|
337
|
+
continue;
|
|
338
|
+
const a = acc[st.stage];
|
|
339
|
+
a.events += 1;
|
|
340
|
+
for (const id of st.ids)
|
|
341
|
+
a.ids.add(id);
|
|
342
|
+
}
|
|
343
|
+
const count = (a) => ({ events: a.events, uniqueIds: a.ids.size });
|
|
344
|
+
return {
|
|
345
|
+
added,
|
|
346
|
+
retrieved: count(acc.retrieved),
|
|
347
|
+
injected: count(acc.injected),
|
|
348
|
+
cited: count(acc.cited),
|
|
349
|
+
applied: count(acc.applied),
|
|
350
|
+
appliedUniqueIds: [...acc.applied.ids].sort(),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/** Атрибуция D4: доля accepted-вердиктов, перед которыми в той же сессии была
|
|
354
|
+
* инъекция (memory_stage injected, session_id !== null, ts <= ts вердикта). */
|
|
355
|
+
function buildAttribution(signals) {
|
|
356
|
+
if (!signals.some((s) => s.event === 'task_evaluated')) {
|
|
357
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no task_evaluated' };
|
|
358
|
+
}
|
|
359
|
+
// ts injected-сигналов по сессии (без session_id в атрибуции не участвуют)
|
|
360
|
+
const injectedTsBySession = new Map();
|
|
361
|
+
for (const s of signals) {
|
|
362
|
+
const st = memoryStageOf(s);
|
|
363
|
+
if (st === null || st.stage !== 'injected' || s.session_id === null)
|
|
364
|
+
continue;
|
|
365
|
+
const arr = injectedTsBySession.get(s.session_id) ?? [];
|
|
366
|
+
arr.push(s.ts);
|
|
367
|
+
injectedTsBySession.set(s.session_id, arr);
|
|
368
|
+
}
|
|
369
|
+
if (injectedTsBySession.size === 0) {
|
|
370
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no injected' };
|
|
371
|
+
}
|
|
372
|
+
let acceptedTotal = 0;
|
|
373
|
+
let acceptedWithInjection = 0;
|
|
374
|
+
for (const s of signals) {
|
|
375
|
+
if (s.event !== 'task_evaluated' || s.detail?.verdict !== 'accepted')
|
|
376
|
+
continue;
|
|
377
|
+
acceptedTotal += 1;
|
|
378
|
+
if (s.session_id === null)
|
|
379
|
+
continue;
|
|
380
|
+
if ((injectedTsBySession.get(s.session_id) ?? []).some((ts) => ts <= s.ts))
|
|
381
|
+
acceptedWithInjection += 1;
|
|
382
|
+
}
|
|
383
|
+
if (acceptedTotal === 0) {
|
|
384
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no accepted verdicts' };
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
acceptedTotal,
|
|
388
|
+
acceptedWithInjection,
|
|
389
|
+
attributionCoveragePct: (acceptedWithInjection / acceptedTotal) * 100,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// --- P3 D2/D3 ---
|
|
393
|
+
/** Валидный campaign_id run-сигнала (guard как experiment в buildReadiness). */
|
|
394
|
+
function runCampaignOf(s) {
|
|
395
|
+
return s.event === 'run' && typeof s.campaign_id === 'string' && s.campaign_id !== '' ? s.campaign_id : null;
|
|
396
|
+
}
|
|
397
|
+
/** Медиана finite weighted ранов когорты (паттерн medianHours); значений нет → null. */
|
|
398
|
+
function medianWeightedOf(runs) {
|
|
399
|
+
const values = runs
|
|
400
|
+
.map((r) => finiteNumber(r.weighted))
|
|
401
|
+
.filter((v) => v !== null)
|
|
402
|
+
.sort((a, b) => a - b);
|
|
403
|
+
if (values.length === 0)
|
|
404
|
+
return null;
|
|
405
|
+
return values.length % 2 === 1
|
|
406
|
+
? values[(values.length - 1) / 2]
|
|
407
|
+
: (values[values.length / 2 - 1] + values[values.length / 2]) / 2;
|
|
408
|
+
}
|
|
409
|
+
/** Когорта кампании: при n < MIN_COHORT_N вся строка метрик n/a + reason (спека D2:
|
|
410
|
+
* «когорта с n < 3 → строка n/a с reason» — доли на малых выборках не показываем). */
|
|
411
|
+
function buildCohort(cohort, runs, verdicts) {
|
|
412
|
+
const n = runs.length;
|
|
413
|
+
const small = n < MIN_COHORT_N;
|
|
414
|
+
return {
|
|
415
|
+
cohort,
|
|
416
|
+
n,
|
|
417
|
+
medianWeighted: !small ? medianWeightedOf(runs) : null,
|
|
418
|
+
acceptedSharePct: !small
|
|
419
|
+
? verdicts.length > 0
|
|
420
|
+
? (verdicts.filter((v) => v.detail?.verdict === 'accepted').length / verdicts.length) * 100
|
|
421
|
+
: null
|
|
422
|
+
: null,
|
|
423
|
+
processFailureRatePct: !small && n > 0 ? (runs.filter((r) => r.outcome !== 'ok').length / n) * 100 : null,
|
|
424
|
+
reason: n === 0 ? 'no runs' : small ? 'n<3: min 3 runs' : null,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
/** Кампании D2: источник — run-сигналы с топ-левел campaign_id; когорта рана — по принадлежности его
|
|
428
|
+
* session_id к глобальному набору injected-сессий (паттерн buildAttribution), session_id null → no_memory.
|
|
429
|
+
* Вердикты кампании (detail.campaign_id === C) атрибутируются той же упрощённой когортой: session_id
|
|
430
|
+
* вердикта ∈ injected-сессий ⟺ with_memory — независимо от наличия ранов в когорте (решение спеки §2 D2). */
|
|
431
|
+
function buildCampaignView(signals) {
|
|
432
|
+
const injectedSessions = new Set();
|
|
433
|
+
for (const s of signals) {
|
|
434
|
+
const st = memoryStageOf(s);
|
|
435
|
+
if (st !== null && st.stage === 'injected' && s.session_id !== null)
|
|
436
|
+
injectedSessions.add(s.session_id);
|
|
437
|
+
}
|
|
438
|
+
const inWithMemory = (s) => s.session_id !== null && injectedSessions.has(s.session_id);
|
|
439
|
+
// campaign → [with_memory, no_memory]
|
|
440
|
+
const runsBy = new Map();
|
|
441
|
+
for (const s of signals) {
|
|
442
|
+
const c = runCampaignOf(s);
|
|
443
|
+
if (c === null)
|
|
444
|
+
continue;
|
|
445
|
+
const pair = runsBy.get(c) ?? [[], []];
|
|
446
|
+
pair[inWithMemory(s) ? 0 : 1].push(s);
|
|
447
|
+
runsBy.set(c, pair);
|
|
448
|
+
}
|
|
449
|
+
const verdictsBy = new Map();
|
|
450
|
+
for (const s of signals) {
|
|
451
|
+
if (s.event !== 'task_evaluated')
|
|
452
|
+
continue;
|
|
453
|
+
const c = s.detail?.campaign_id;
|
|
454
|
+
if (typeof c !== 'string' || c === '')
|
|
455
|
+
continue;
|
|
456
|
+
const pair = verdictsBy.get(c) ?? [[], []];
|
|
457
|
+
pair[inWithMemory(s) ? 0 : 1].push(s);
|
|
458
|
+
verdictsBy.set(c, pair);
|
|
459
|
+
}
|
|
460
|
+
const rows = [...runsBy.entries()]
|
|
461
|
+
.map(([campaign, [withRuns, noRuns]]) => {
|
|
462
|
+
const [withVerdicts, noVerdicts] = verdictsBy.get(campaign) ?? [[], []];
|
|
463
|
+
return {
|
|
464
|
+
campaign,
|
|
465
|
+
runs: withRuns.length + noRuns.length,
|
|
466
|
+
hasVerdicts: withVerdicts.length + noVerdicts.length > 0,
|
|
467
|
+
withMemory: buildCohort('with_memory', withRuns, withVerdicts),
|
|
468
|
+
noMemory: buildCohort('no_memory', noRuns, noVerdicts),
|
|
469
|
+
};
|
|
470
|
+
})
|
|
471
|
+
.sort((a, b) => b.runs - a.runs || a.campaign.localeCompare(b.campaign));
|
|
472
|
+
return { rows };
|
|
473
|
+
}
|
|
474
|
+
/** Per-memory ROI D3: строки создают валидные injected-события (≥1); associatedAccepted — accepted-вердикты
|
|
475
|
+
* сессий, где id инъецировался не позже вердикта (каждый вердикт — один раз на id); applied чужих id
|
|
476
|
+
* (без injected-строки) не учитывается. Корреляционная витрина, не причинность. */
|
|
477
|
+
function buildMemoryRoi(signals) {
|
|
478
|
+
const acc = new Map();
|
|
479
|
+
const rowOf = (id) => {
|
|
480
|
+
let r = acc.get(id);
|
|
481
|
+
if (r === undefined) {
|
|
482
|
+
r = { injectedEvents: 0, appliedEvents: 0, lastActivity: null };
|
|
483
|
+
acc.set(id, r);
|
|
484
|
+
}
|
|
485
|
+
return r;
|
|
486
|
+
};
|
|
487
|
+
const bump = (r, ts) => {
|
|
488
|
+
if (r.lastActivity === null || ts > r.lastActivity)
|
|
489
|
+
r.lastActivity = ts;
|
|
490
|
+
};
|
|
491
|
+
// инъекции id по сессии (session_id !== null) — база associatedAccepted
|
|
492
|
+
const injectionsBySession = new Map();
|
|
493
|
+
for (const s of signals) {
|
|
494
|
+
const st = memoryStageOf(s);
|
|
495
|
+
if (st === null)
|
|
496
|
+
continue;
|
|
497
|
+
if (st.stage === 'injected') {
|
|
498
|
+
for (const id of st.ids) {
|
|
499
|
+
const r = rowOf(id);
|
|
500
|
+
r.injectedEvents += 1;
|
|
501
|
+
bump(r, s.ts);
|
|
502
|
+
if (s.session_id !== null) {
|
|
503
|
+
const arr = injectionsBySession.get(s.session_id) ?? [];
|
|
504
|
+
arr.push({ id, ts: s.ts });
|
|
505
|
+
injectionsBySession.set(s.session_id, arr);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else if (st.stage === 'applied') {
|
|
510
|
+
for (const id of st.ids) {
|
|
511
|
+
const r = acc.get(id);
|
|
512
|
+
if (r === undefined)
|
|
513
|
+
continue;
|
|
514
|
+
r.appliedEvents += 1;
|
|
515
|
+
bump(r, s.ts);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const associated = new Map();
|
|
520
|
+
for (const s of signals) {
|
|
521
|
+
if (s.event !== 'task_evaluated' || s.detail?.verdict !== 'accepted' || s.session_id === null)
|
|
522
|
+
continue;
|
|
523
|
+
const ids = new Set();
|
|
524
|
+
for (const inj of injectionsBySession.get(s.session_id) ?? []) {
|
|
525
|
+
if (inj.ts <= s.ts)
|
|
526
|
+
ids.add(inj.id);
|
|
527
|
+
}
|
|
528
|
+
for (const id of ids)
|
|
529
|
+
associated.set(id, (associated.get(id) ?? 0) + 1);
|
|
530
|
+
}
|
|
531
|
+
const rows = [...acc.entries()]
|
|
532
|
+
.map(([id, r]) => ({
|
|
533
|
+
id,
|
|
534
|
+
associatedAccepted: associated.get(id) ?? 0,
|
|
535
|
+
associatedApplied: r.appliedEvents,
|
|
536
|
+
injectedTotal: r.injectedEvents,
|
|
537
|
+
lastActivity: r.lastActivity,
|
|
538
|
+
}))
|
|
539
|
+
.sort((a, b) => b.associatedAccepted - a.associatedAccepted || b.injectedTotal - a.injectedTotal || a.id.localeCompare(b.id));
|
|
540
|
+
return { rows };
|
|
541
|
+
}
|
|
542
|
+
/** Валидный coord_event-сигнал (D5 guard): kind/actor_from — строки, refs — массив строк. */
|
|
543
|
+
function coordEventOf(s) {
|
|
544
|
+
if (s.event !== 'coord_event')
|
|
545
|
+
return null;
|
|
546
|
+
const d = s.detail;
|
|
547
|
+
if (d === undefined || typeof d.kind !== 'string' || typeof d.actor_from !== 'string' || !Array.isArray(d.refs)) {
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
return {
|
|
551
|
+
kind: d.kind,
|
|
552
|
+
from: d.actor_from,
|
|
553
|
+
to: typeof d.actor_to === 'string' ? d.actor_to : null,
|
|
554
|
+
refs: d.refs.filter((r) => typeof r === 'string' && r !== ''),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
/** Координация D5: counts (kind × actor_from), последние 20 событий, blocker-пары
|
|
558
|
+
* (ref → earliest blocker-открытие → первый memory.resolved не раньше openedAt). */
|
|
559
|
+
function buildCoordination(signals, events) {
|
|
560
|
+
const parsed = [];
|
|
561
|
+
// ключ kind ⊕ actor_from; \u001f не встречается в именах агентов (unit-separator)
|
|
562
|
+
const countAcc = new Map();
|
|
563
|
+
for (const s of signals) {
|
|
564
|
+
const c = coordEventOf(s);
|
|
565
|
+
if (c === null)
|
|
566
|
+
continue;
|
|
567
|
+
parsed.push({ ts: s.ts, ...c });
|
|
568
|
+
const key = `${c.kind}\u001f${c.from}`;
|
|
569
|
+
const cur = countAcc.get(key);
|
|
570
|
+
if (cur === undefined)
|
|
571
|
+
countAcc.set(key, { kind: c.kind, actorFrom: c.from, count: 1 });
|
|
572
|
+
else
|
|
573
|
+
cur.count += 1;
|
|
574
|
+
}
|
|
575
|
+
const counts = [...countAcc.values()].sort((a, b) => b.count - a.count || a.kind.localeCompare(b.kind) || a.actorFrom.localeCompare(b.actorFrom));
|
|
576
|
+
const recent = [...parsed].sort((a, b) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0)).slice(0, 20);
|
|
577
|
+
// openedAt по ref — самый ранний blocker-сигнал
|
|
578
|
+
const openedByRef = new Map();
|
|
579
|
+
for (const p of parsed) {
|
|
580
|
+
if (p.kind !== 'blocker')
|
|
581
|
+
continue;
|
|
582
|
+
for (const ref of p.refs) {
|
|
583
|
+
const cur = openedByRef.get(ref);
|
|
584
|
+
if (cur === undefined || p.ts < cur)
|
|
585
|
+
openedByRef.set(ref, p.ts);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// resolvedAt: первый memory.resolved с payload.memory_id === ref и timestamp >= openedAt
|
|
589
|
+
const resolvedTsById = new Map();
|
|
590
|
+
for (const ev of events) {
|
|
591
|
+
if (ev.type !== 'memory.resolved')
|
|
592
|
+
continue;
|
|
593
|
+
const mid = ev.payload?.memory_id;
|
|
594
|
+
if (typeof mid !== 'string')
|
|
595
|
+
continue;
|
|
596
|
+
const arr = resolvedTsById.get(mid) ?? [];
|
|
597
|
+
arr.push(ev.timestamp);
|
|
598
|
+
resolvedTsById.set(mid, arr);
|
|
599
|
+
}
|
|
600
|
+
const blockers = [...openedByRef.entries()]
|
|
601
|
+
.map(([ref, openedAt]) => {
|
|
602
|
+
const resolvedAt = (resolvedTsById.get(ref) ?? []).filter((ts) => ts >= openedAt).sort()[0];
|
|
603
|
+
return { ref, openedAt, resolvedAt: resolvedAt ?? null };
|
|
604
|
+
})
|
|
605
|
+
.sort((a, b) => a.ref.localeCompare(b.ref));
|
|
606
|
+
return { counts, recent, blockers };
|
|
607
|
+
}
|
|
305
608
|
/** Agent ledger Q11: строки по run-агентам ∪ complaint-акторам `agent:<имя>`; три уровня —
|
|
306
609
|
* объём (runs/weighted/duration/cost), проблемы (processFailures/toolErrors/жалобы), достижения
|
|
307
610
|
* (completedRuns/accepted/holdout_prevented его rule/lesson). */
|
|
@@ -721,7 +1024,14 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
721
1024
|
seenEventIds.add(s.event_id);
|
|
722
1025
|
signals.push(s);
|
|
723
1026
|
}
|
|
724
|
-
const memory =
|
|
1027
|
+
const memory = {
|
|
1028
|
+
...buildMemoryLedger(allObjects, events, signals, now, thresholds),
|
|
1029
|
+
// P2 D4: воронка added→applied + атрибуция accepted-вердиктов к инъекциям
|
|
1030
|
+
funnel: buildLifecycleFunnel(allObjects.length, signals),
|
|
1031
|
+
attribution: buildAttribution(signals),
|
|
1032
|
+
// P3 D3: per-memory ROI (корреляционная витрина)
|
|
1033
|
+
roi: buildMemoryRoi(signals),
|
|
1034
|
+
};
|
|
725
1035
|
// P1 D4: канонический источник run-метрик — сигналы + compat-мерж legacy run-log
|
|
726
1036
|
const runEntries = mergeRunEntries(signals, input.runLogText);
|
|
727
1037
|
const tools = buildToolLedger(allObjects.filter((o) => o.type === 'tool'), signals, runEntries, input.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD);
|
|
@@ -733,6 +1043,8 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
733
1043
|
const steward = buildSteward(events, signals, allObjects, now, weeks);
|
|
734
1044
|
const readiness = buildReadiness(signals);
|
|
735
1045
|
const councils = await buildCouncils(allObjects, deps.relations, now, weeks);
|
|
1046
|
+
const coordination = buildCoordination(signals, events); // P2 D5
|
|
1047
|
+
const campaign = buildCampaignView(signals); // P3 D2
|
|
736
1048
|
const coverage = buildCoverage(signals);
|
|
737
1049
|
// D6: unknown-model и pricing-coverage по дедуплицированным run-сигналам
|
|
738
1050
|
const runSignals = signals.filter((s) => s.event === 'run');
|
|
@@ -767,6 +1079,8 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
767
1079
|
steward,
|
|
768
1080
|
readiness,
|
|
769
1081
|
councils,
|
|
1082
|
+
coordination,
|
|
1083
|
+
campaign,
|
|
770
1084
|
acceptance: { accepted: acceptance.accepted, costPerAcceptedTask: acceptance.costPerAcceptedTask },
|
|
771
1085
|
coverage,
|
|
772
1086
|
dataQuality,
|
|
@@ -782,7 +1096,15 @@ export function filterAnalytics(report, filter) {
|
|
|
782
1096
|
rows = rows.filter((r) => r.lifecycle === filter.class);
|
|
783
1097
|
if (filter.type !== undefined)
|
|
784
1098
|
rows = rows.filter((r) => r.type === filter.type);
|
|
785
|
-
return {
|
|
1099
|
+
return {
|
|
1100
|
+
view: 'memory',
|
|
1101
|
+
rows: rows.slice(0, top),
|
|
1102
|
+
garbage: report.memory.garbage,
|
|
1103
|
+
funnel: report.memory.funnel,
|
|
1104
|
+
attribution: report.memory.attribution,
|
|
1105
|
+
// P3 D3: roi без top-лимита (срез делает render-слой); строки уже отсортированы
|
|
1106
|
+
roi: report.memory.roi,
|
|
1107
|
+
};
|
|
786
1108
|
}
|
|
787
1109
|
case 'tools': {
|
|
788
1110
|
let rows = report.tools;
|
|
@@ -812,6 +1134,10 @@ export function filterAnalytics(report, filter) {
|
|
|
812
1134
|
return { view: 'readiness', readiness: report.readiness };
|
|
813
1135
|
case 'councils':
|
|
814
1136
|
return { view: 'councils', councils: report.councils };
|
|
1137
|
+
case 'coordination':
|
|
1138
|
+
return { view: 'coordination', coordination: report.coordination };
|
|
1139
|
+
case 'campaign':
|
|
1140
|
+
return { view: 'campaign', campaign: report.campaign };
|
|
815
1141
|
case 'all':
|
|
816
1142
|
return { view: 'all', report };
|
|
817
1143
|
}
|