mister-wolf 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  2. package/dist/adapters/cli/cli-entry.js +6 -9
  3. package/dist/adapters/cli/cli-entry.js.map +1 -1
  4. package/dist/adapters/cli/commands/analytics.d.ts +2 -2
  5. package/dist/adapters/cli/commands/analytics.d.ts.map +1 -1
  6. package/dist/adapters/cli/commands/analytics.js +42 -5
  7. package/dist/adapters/cli/commands/analytics.js.map +1 -1
  8. package/dist/adapters/cli/commands/coord.d.ts +3 -0
  9. package/dist/adapters/cli/commands/coord.d.ts.map +1 -0
  10. package/dist/adapters/cli/commands/coord.js +36 -0
  11. package/dist/adapters/cli/commands/coord.js.map +1 -0
  12. package/dist/adapters/cli/commands/memory-brief.d.ts.map +1 -1
  13. package/dist/adapters/cli/commands/memory-brief.js +16 -0
  14. package/dist/adapters/cli/commands/memory-brief.js.map +1 -1
  15. package/dist/adapters/cli/commands/memory-call.d.ts.map +1 -1
  16. package/dist/adapters/cli/commands/memory-call.js +16 -2
  17. package/dist/adapters/cli/commands/memory-call.js.map +1 -1
  18. package/dist/adapters/cli/commands/memory-get.d.ts.map +1 -1
  19. package/dist/adapters/cli/commands/memory-get.js +18 -0
  20. package/dist/adapters/cli/commands/memory-get.js.map +1 -1
  21. package/dist/adapters/cli/commands/memory-migrate.d.ts.map +1 -1
  22. package/dist/adapters/cli/commands/memory-migrate.js +28 -0
  23. package/dist/adapters/cli/commands/memory-migrate.js.map +1 -1
  24. package/dist/adapters/cli/commands/memory-run.d.ts.map +1 -1
  25. package/dist/adapters/cli/commands/memory-run.js +36 -23
  26. package/dist/adapters/cli/commands/memory-run.js.map +1 -1
  27. package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
  28. package/dist/adapters/cli/commands/memory-search.js +16 -0
  29. package/dist/adapters/cli/commands/memory-search.js.map +1 -1
  30. package/dist/adapters/cli/commands/memory-stage.d.ts +3 -0
  31. package/dist/adapters/cli/commands/memory-stage.d.ts.map +1 -0
  32. package/dist/adapters/cli/commands/memory-stage.js +35 -0
  33. package/dist/adapters/cli/commands/memory-stage.js.map +1 -0
  34. package/dist/adapters/cli/commands/memory-tool.d.ts.map +1 -1
  35. package/dist/adapters/cli/commands/memory-tool.js +4 -3
  36. package/dist/adapters/cli/commands/memory-tool.js.map +1 -1
  37. package/dist/adapters/fs/run-log-migration.d.ts +18 -0
  38. package/dist/adapters/fs/run-log-migration.d.ts.map +1 -0
  39. package/dist/adapters/fs/run-log-migration.js +63 -0
  40. package/dist/adapters/fs/run-log-migration.js.map +1 -0
  41. package/dist/adapters/fs/session-metrics-log.d.ts +87 -2
  42. package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
  43. package/dist/adapters/fs/session-metrics-log.js +105 -2
  44. package/dist/adapters/fs/session-metrics-log.js.map +1 -1
  45. package/dist/adapters/mcp/mcp-schemas.d.ts +1 -0
  46. package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
  47. package/dist/adapters/mcp/mcp-schemas.js +1 -0
  48. package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
  49. package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
  50. package/dist/adapters/mcp/mcp-tools.js +104 -23
  51. package/dist/adapters/mcp/mcp-tools.js.map +1 -1
  52. package/dist/adapters/version.d.ts +3 -0
  53. package/dist/adapters/version.d.ts.map +1 -0
  54. package/dist/adapters/version.js +12 -0
  55. package/dist/adapters/version.js.map +1 -0
  56. package/dist/app/use-cases/build-analytics.d.ts +67 -1
  57. package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
  58. package/dist/app/use-cases/build-analytics.js +225 -29
  59. package/dist/app/use-cases/build-analytics.js.map +1 -1
  60. package/dist/app/use-cases/effectiveness.d.ts.map +1 -1
  61. package/dist/app/use-cases/effectiveness.js +8 -6
  62. package/dist/app/use-cases/effectiveness.js.map +1 -1
  63. package/dist/app/use-cases/generate-agent-brief.d.ts +2 -0
  64. package/dist/app/use-cases/generate-agent-brief.d.ts.map +1 -1
  65. package/dist/app/use-cases/generate-agent-brief.js +1 -1
  66. package/dist/app/use-cases/generate-agent-brief.js.map +1 -1
  67. package/dist/app/use-cases/run-source.d.ts +15 -0
  68. package/dist/app/use-cases/run-source.d.ts.map +1 -0
  69. package/dist/app/use-cases/run-source.js +26 -0
  70. package/dist/app/use-cases/run-source.js.map +1 -0
  71. package/dist/app/use-cases/tool-stats.d.ts +5 -1
  72. package/dist/app/use-cases/tool-stats.d.ts.map +1 -1
  73. package/dist/app/use-cases/tool-stats.js +6 -13
  74. package/dist/app/use-cases/tool-stats.js.map +1 -1
  75. package/dist/domain/actor.d.ts +3 -0
  76. package/dist/domain/actor.d.ts.map +1 -1
  77. package/dist/domain/actor.js +6 -0
  78. package/dist/domain/actor.js.map +1 -1
  79. package/package.json +1 -1
@@ -104,10 +104,68 @@ 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
+ /** P2 D5: координационное view. */
131
+ export interface CoordinationCount {
132
+ kind: string;
133
+ actorFrom: string;
134
+ count: number;
135
+ }
136
+ export interface CoordinationRecentEvent {
137
+ ts: string;
138
+ kind: string;
139
+ from: string;
140
+ to: string | null;
141
+ refs: string[];
142
+ }
143
+ export interface CoordinationBlockerPair {
144
+ ref: string;
145
+ openedAt: string;
146
+ resolvedAt: string | null;
147
+ }
148
+ export interface CoordinationView {
149
+ /** kind × actor_from; sort: count убыв., потом kind, потом actorFrom. */
150
+ counts: CoordinationCount[];
151
+ /** Последние 20 по ts, свежие первыми. */
152
+ recent: CoordinationRecentEvent[];
153
+ /** По refs coord_event kind=blocker, sort по ref. */
154
+ blockers: CoordinationBlockerPair[];
155
+ }
107
156
  /** D7: data-quality сигнального лога (битые строки не роняют контур — только метрика). */
108
157
  export interface DataQualityStats {
109
158
  validEventRatePct: number | null;
110
159
  malformedLines: number;
160
+ /** D6: повторы event_id в логе (вторая копия в аналитику не попадает); null — нет событий с event_id. */
161
+ duplicateEventRatePct: number | null;
162
+ /** D6: run-события с modelID null/'unknown' / все run-события; null — нет run-событий. */
163
+ unknownModelRatePct: number | null;
164
+ /** D6: run с tokens, чья модель есть в pricing / все run с tokens; null — pricing нет или нет run с tokens. */
165
+ pricingCoveragePct: number | null;
166
+ /** D6: всегда null до span-модели (P2). */
167
+ completeTraceRatePct: null;
168
+ completeTraceRateReason: string;
111
169
  }
112
170
  export interface StewardView {
113
171
  mutations: {
@@ -186,6 +244,8 @@ export interface AnalyticsReport {
186
244
  memory: {
187
245
  rows: MemoryLedgerRow[];
188
246
  garbage: GarbageStats;
247
+ funnel: MemoryLifecycleFunnel;
248
+ attribution: AttributionCoverage;
189
249
  };
190
250
  tools: ToolLedgerRow[];
191
251
  rules: RuleRankingRow[];
@@ -195,6 +255,7 @@ export interface AnalyticsReport {
195
255
  steward: StewardView;
196
256
  readiness: ExperimentReadiness;
197
257
  councils: CouncilsView;
258
+ coordination: CoordinationView;
198
259
  acceptance: AcceptanceStats;
199
260
  coverage: CoverageStats;
200
261
  dataQuality: DataQualityStats;
@@ -225,7 +286,7 @@ export interface AnalyticsInput {
225
286
  */
226
287
  export declare function buildAnalyticsReport(deps: AnalyticsDeps, input: AnalyticsInput): Promise<AnalyticsReport>;
227
288
  export interface AnalyticsViewFilter {
228
- view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'all';
289
+ view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'coordination' | 'all';
229
290
  class?: 'new' | 'sleeper' | 'workhorse' | 'dead';
230
291
  type?: string;
231
292
  origin?: 'script' | 'model-native';
@@ -237,6 +298,8 @@ export type AnalyticsViewPayload = {
237
298
  view: 'memory';
238
299
  rows: MemoryLedgerRow[];
239
300
  garbage: GarbageStats;
301
+ funnel: MemoryLifecycleFunnel;
302
+ attribution: AttributionCoverage;
240
303
  } | {
241
304
  view: 'tools';
242
305
  rows: ToolLedgerRow[];
@@ -261,6 +324,9 @@ export type AnalyticsViewPayload = {
261
324
  } | {
262
325
  view: 'councils';
263
326
  councils: CouncilsView;
327
+ } | {
328
+ view: 'coordination';
329
+ coordination: CoordinationView;
264
330
  } | {
265
331
  view: 'all';
266
332
  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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"}
@@ -1,8 +1,8 @@
1
1
  import { DEFAULT_PATTERN_THRESHOLD } from '../../adapters/fs/session-metrics-log.js';
2
- import { parseRunLog } from '../../domain/tool-economy.js';
3
2
  import { UNCATEGORIZED_ERROR_CLASS } from '../../domain/error-class.js';
4
3
  import { runCostUsd } from '../../domain/pricing.js';
5
4
  import { silentRuleIds } from './learn-decay.js';
5
+ import { mergeRunEntries } from './run-source.js';
6
6
  import { mondayOf } from './generate-insights.js';
7
7
  import { extractVote } from './tally-council-votes.js';
8
8
  export const DEFAULT_LIFECYCLE_THRESHOLDS = { newDays: 14, workhorseUses: 3 };
@@ -25,7 +25,8 @@ export function classifyLifecycle(uses, ageDays, t) {
25
25
  function finiteNumber(value) {
26
26
  return typeof value === 'number' && Number.isFinite(value) ? value : null;
27
27
  }
28
- /** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7. */
28
+ /** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7.
29
+ * (funnel/attribution добавляет вызов buildAnalyticsReport — P2 D4.) */
29
30
  function buildMemoryLedger(objects, events, signals, now, t) {
30
31
  const rows = [];
31
32
  for (const o of objects) {
@@ -101,7 +102,7 @@ function toolNameOf(o) {
101
102
  return o.type === 'tool' && typeof rec.name === 'string' && rec.name !== '' ? rec.name : null;
102
103
  }
103
104
  /** Tool ledger (Q3, D11): script = объекты type:'tool'; model-native = имена из логов минус script. */
104
- function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
105
+ function buildToolLedger(toolObjects, signals, runEntries, patternThreshold) {
105
106
  // ошибки по имени тула: tool_error-сигналы, группа по error_class_id
106
107
  const errorsByName = new Map();
107
108
  for (const ev of signals) {
@@ -143,7 +144,8 @@ function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
143
144
  promotion: o.status === 'candidate' && usageCount >= patternThreshold ? 'expose-candidate' : null,
144
145
  });
145
146
  }
146
- // model-native: имена из tool_error-сигналов ∪ run-log tools[], минус зарегистрированные script
147
+ // model-native: имена из tool_error-сигналов ∪ run-entries tools[] (P1 D4: сигналы + legacy),
148
+ // минус зарегистрированные script
147
149
  const nativeCounts = new Map();
148
150
  const bumpNative = (name) => {
149
151
  nativeCounts.set(name, (nativeCounts.get(name) ?? 0) + 1);
@@ -152,7 +154,7 @@ function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
152
154
  if (ev.event === 'tool_error' && typeof ev.tool_name === 'string')
153
155
  bumpNative(ev.tool_name);
154
156
  }
155
- for (const entry of parseRunLog(runLogText ?? '')) {
157
+ for (const entry of runEntries) {
156
158
  for (const name of entry.tools ?? [])
157
159
  bumpNative(name);
158
160
  }
@@ -236,9 +238,10 @@ function buildWeeklyActivity(events, signals, now, weeks) {
236
238
  deliverToTriggerPct: delivers > 0 ? (names.size / delivers) * 100 : null,
237
239
  }));
238
240
  }
239
- /** Outliers Q8: top-N прогонов по finite weighted; $ при pricing (D9 — без данных null). */
240
- function buildOutliers(runLogText, pricing, top) {
241
- return parseRunLog(runLogText ?? '')
241
+ /** Outliers Q8: top-N прогонов по finite weighted (P1 D4: сигналы + legacy run-log);
242
+ * $ при pricing (D9 — без данных null). */
243
+ function buildOutliers(runEntries, pricing, top) {
244
+ return runEntries
242
245
  .filter((e) => finiteNumber(e.weighted) !== null)
243
246
  .sort((a, b) => (b.weighted ?? 0) - (a.weighted ?? 0))
244
247
  .slice(0, top)
@@ -300,6 +303,155 @@ function buildCoverage(signals) {
300
303
  const runs = signals.filter((s) => s.event === 'run').length;
301
304
  return { scored, runs, scoredTaskRatePct: runs > 0 ? (scored / runs) * 100 : null };
302
305
  }
306
+ /** Валидный memory_stage-сигнал (D4 guard): detail есть, stage — одна из четырёх,
307
+ * memory_ids — массив непустых строк (≥1); малформ → null, отчёт не роняет. */
308
+ function memoryStageOf(s) {
309
+ if (s.event !== 'memory_stage')
310
+ return null;
311
+ const d = s.detail;
312
+ if (d === undefined)
313
+ return null;
314
+ const stage = d.stage;
315
+ if (stage !== 'retrieved' && stage !== 'injected' && stage !== 'cited' && stage !== 'applied') {
316
+ return null;
317
+ }
318
+ if (!Array.isArray(d.memory_ids))
319
+ return null;
320
+ const ids = d.memory_ids.filter((id) => typeof id === 'string' && id !== '');
321
+ return ids.length > 0 ? { stage, ids } : null;
322
+ }
323
+ /** Воронка D4: added = все объекты store; стадии — события + уникальные memory_ids. */
324
+ function buildLifecycleFunnel(added, signals) {
325
+ const acc = {
326
+ retrieved: { events: 0, ids: new Set() },
327
+ injected: { events: 0, ids: new Set() },
328
+ cited: { events: 0, ids: new Set() },
329
+ applied: { events: 0, ids: new Set() },
330
+ };
331
+ for (const s of signals) {
332
+ const st = memoryStageOf(s);
333
+ if (st === null)
334
+ continue;
335
+ const a = acc[st.stage];
336
+ a.events += 1;
337
+ for (const id of st.ids)
338
+ a.ids.add(id);
339
+ }
340
+ const count = (a) => ({ events: a.events, uniqueIds: a.ids.size });
341
+ return {
342
+ added,
343
+ retrieved: count(acc.retrieved),
344
+ injected: count(acc.injected),
345
+ cited: count(acc.cited),
346
+ applied: count(acc.applied),
347
+ appliedUniqueIds: [...acc.applied.ids].sort(),
348
+ };
349
+ }
350
+ /** Атрибуция D4: доля accepted-вердиктов, перед которыми в той же сессии была
351
+ * инъекция (memory_stage injected, session_id !== null, ts <= ts вердикта). */
352
+ function buildAttribution(signals) {
353
+ if (!signals.some((s) => s.event === 'task_evaluated')) {
354
+ return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no task_evaluated' };
355
+ }
356
+ // ts injected-сигналов по сессии (без session_id в атрибуции не участвуют)
357
+ const injectedTsBySession = new Map();
358
+ for (const s of signals) {
359
+ const st = memoryStageOf(s);
360
+ if (st === null || st.stage !== 'injected' || s.session_id === null)
361
+ continue;
362
+ const arr = injectedTsBySession.get(s.session_id) ?? [];
363
+ arr.push(s.ts);
364
+ injectedTsBySession.set(s.session_id, arr);
365
+ }
366
+ if (injectedTsBySession.size === 0) {
367
+ return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no injected' };
368
+ }
369
+ let acceptedTotal = 0;
370
+ let acceptedWithInjection = 0;
371
+ for (const s of signals) {
372
+ if (s.event !== 'task_evaluated' || s.detail?.verdict !== 'accepted')
373
+ continue;
374
+ acceptedTotal += 1;
375
+ if (s.session_id === null)
376
+ continue;
377
+ if ((injectedTsBySession.get(s.session_id) ?? []).some((ts) => ts <= s.ts))
378
+ acceptedWithInjection += 1;
379
+ }
380
+ if (acceptedTotal === 0) {
381
+ return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no accepted verdicts' };
382
+ }
383
+ return {
384
+ acceptedTotal,
385
+ acceptedWithInjection,
386
+ attributionCoveragePct: (acceptedWithInjection / acceptedTotal) * 100,
387
+ };
388
+ }
389
+ /** Валидный coord_event-сигнал (D5 guard): kind/actor_from — строки, refs — массив строк. */
390
+ function coordEventOf(s) {
391
+ if (s.event !== 'coord_event')
392
+ return null;
393
+ const d = s.detail;
394
+ if (d === undefined || typeof d.kind !== 'string' || typeof d.actor_from !== 'string' || !Array.isArray(d.refs)) {
395
+ return null;
396
+ }
397
+ return {
398
+ kind: d.kind,
399
+ from: d.actor_from,
400
+ to: typeof d.actor_to === 'string' ? d.actor_to : null,
401
+ refs: d.refs.filter((r) => typeof r === 'string' && r !== ''),
402
+ };
403
+ }
404
+ /** Координация D5: counts (kind × actor_from), последние 20 событий, blocker-пары
405
+ * (ref → earliest blocker-открытие → первый memory.resolved не раньше openedAt). */
406
+ function buildCoordination(signals, events) {
407
+ const parsed = [];
408
+ // ключ kind ⊕ actor_from; \u001f не встречается в именах агентов (unit-separator)
409
+ const countAcc = new Map();
410
+ for (const s of signals) {
411
+ const c = coordEventOf(s);
412
+ if (c === null)
413
+ continue;
414
+ parsed.push({ ts: s.ts, ...c });
415
+ const key = `${c.kind}\u001f${c.from}`;
416
+ const cur = countAcc.get(key);
417
+ if (cur === undefined)
418
+ countAcc.set(key, { kind: c.kind, actorFrom: c.from, count: 1 });
419
+ else
420
+ cur.count += 1;
421
+ }
422
+ const counts = [...countAcc.values()].sort((a, b) => b.count - a.count || a.kind.localeCompare(b.kind) || a.actorFrom.localeCompare(b.actorFrom));
423
+ const recent = [...parsed].sort((a, b) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0)).slice(0, 20);
424
+ // openedAt по ref — самый ранний blocker-сигнал
425
+ const openedByRef = new Map();
426
+ for (const p of parsed) {
427
+ if (p.kind !== 'blocker')
428
+ continue;
429
+ for (const ref of p.refs) {
430
+ const cur = openedByRef.get(ref);
431
+ if (cur === undefined || p.ts < cur)
432
+ openedByRef.set(ref, p.ts);
433
+ }
434
+ }
435
+ // resolvedAt: первый memory.resolved с payload.memory_id === ref и timestamp >= openedAt
436
+ const resolvedTsById = new Map();
437
+ for (const ev of events) {
438
+ if (ev.type !== 'memory.resolved')
439
+ continue;
440
+ const mid = ev.payload?.memory_id;
441
+ if (typeof mid !== 'string')
442
+ continue;
443
+ const arr = resolvedTsById.get(mid) ?? [];
444
+ arr.push(ev.timestamp);
445
+ resolvedTsById.set(mid, arr);
446
+ }
447
+ const blockers = [...openedByRef.entries()]
448
+ .map(([ref, openedAt]) => {
449
+ const resolvedAt = (resolvedTsById.get(ref) ?? []).filter((ts) => ts >= openedAt).sort()[0];
450
+ return { ref, openedAt, resolvedAt: resolvedAt ?? null };
451
+ })
452
+ .sort((a, b) => a.ref.localeCompare(b.ref));
453
+ return { counts, recent, blockers };
454
+ }
303
455
  /** Agent ledger Q11: строки по run-агентам ∪ complaint-акторам `agent:<имя>`; три уровня —
304
456
  * объём (runs/weighted/duration/cost), проблемы (processFailures/toolErrors/жалобы), достижения
305
457
  * (completedRuns/accepted/holdout_prevented его rule/lesson). */
@@ -702,28 +854,63 @@ export async function buildAnalyticsReport(deps, input) {
702
854
  const allObjects = await deps.store.list();
703
855
  const events = await deps.log.readAll();
704
856
  const weeks = input.weeks ?? 8;
705
- const memory = buildMemoryLedger(allObjects, events, input.signals, now, thresholds);
706
- const tools = buildToolLedger(allObjects.filter((o) => o.type === 'tool'), input.signals, input.runLogText, input.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD);
707
- const rules = buildRuleRanking(allObjects.filter((o) => o.type === 'rule'), input.signals);
708
- const weeklyActivity = buildWeeklyActivity(events, input.signals, now, weeks);
709
- const outliers = buildOutliers(input.runLogText, input.pricing, input.topOutliers ?? 10);
710
- const acceptance = buildAcceptance(input.signals);
711
- const agents = buildAgents(input.signals, allObjects, input.pricing, acceptance.acceptedByAgent);
712
- const steward = buildSteward(events, input.signals, allObjects, now, weeks);
713
- const readiness = buildReadiness(input.signals);
857
+ // P1 D7: дедуп signals по event_id (остаётся первая копия по порядку) — повтор не
858
+ // попадает ни в один построитель отчёта; считается метрикой duplicateEventRatePct.
859
+ const seenEventIds = new Set();
860
+ let duplicateLines = 0;
861
+ const signals = [];
862
+ for (const s of input.signals) {
863
+ if (s.event_id === undefined) {
864
+ signals.push(s);
865
+ continue;
866
+ }
867
+ if (seenEventIds.has(s.event_id)) {
868
+ duplicateLines += 1;
869
+ continue;
870
+ }
871
+ seenEventIds.add(s.event_id);
872
+ signals.push(s);
873
+ }
874
+ const memory = {
875
+ ...buildMemoryLedger(allObjects, events, signals, now, thresholds),
876
+ // P2 D4: воронка added→applied + атрибуция accepted-вердиктов к инъекциям
877
+ funnel: buildLifecycleFunnel(allObjects.length, signals),
878
+ attribution: buildAttribution(signals),
879
+ };
880
+ // P1 D4: канонический источник run-метрик — сигналы + compat-мерж legacy run-log
881
+ const runEntries = mergeRunEntries(signals, input.runLogText);
882
+ const tools = buildToolLedger(allObjects.filter((o) => o.type === 'tool'), signals, runEntries, input.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD);
883
+ const rules = buildRuleRanking(allObjects.filter((o) => o.type === 'rule'), signals);
884
+ const weeklyActivity = buildWeeklyActivity(events, signals, now, weeks);
885
+ const outliers = buildOutliers(runEntries, input.pricing, input.topOutliers ?? 10);
886
+ const acceptance = buildAcceptance(signals);
887
+ const agents = buildAgents(signals, allObjects, input.pricing, acceptance.acceptedByAgent);
888
+ const steward = buildSteward(events, signals, allObjects, now, weeks);
889
+ const readiness = buildReadiness(signals);
714
890
  const councils = await buildCouncils(allObjects, deps.relations, now, weeks);
715
- const coverage = buildCoverage(input.signals);
891
+ const coordination = buildCoordination(signals, events); // P2 D5
892
+ const coverage = buildCoverage(signals);
893
+ // D6: unknown-model и pricing-coverage по дедуплицированным run-сигналам
894
+ const runSignals = signals.filter((s) => s.event === 'run');
895
+ const unknownModels = runSignals.filter((s) => s.gen_ai.modelID === null || s.gen_ai.modelID === 'unknown').length;
896
+ const runsWithTokens = runSignals.filter((s) => s.tokens !== undefined);
897
+ const pricedRuns = input.pricing === undefined
898
+ ? 0
899
+ : runsWithTokens.filter((s) => runCostUsd(s.tokens, input.pricing, s.gen_ai.modelID) !== null).length;
716
900
  // D7: без signalLogStats (старые вызывающие) → n/a; totalLines=0 → null-процент
717
- const dataQuality = input.signalLogStats === undefined
718
- ? { validEventRatePct: null, malformedLines: 0 }
719
- : {
720
- validEventRatePct: input.signalLogStats.totalLines > 0
721
- ? ((input.signalLogStats.totalLines - input.signalLogStats.malformedLines) /
722
- input.signalLogStats.totalLines) *
723
- 100
724
- : null,
725
- malformedLines: input.signalLogStats.malformedLines,
726
- };
901
+ const dataQuality = {
902
+ validEventRatePct: input.signalLogStats === undefined || input.signalLogStats.totalLines <= 0
903
+ ? null
904
+ : ((input.signalLogStats.totalLines - input.signalLogStats.malformedLines) / input.signalLogStats.totalLines) *
905
+ 100,
906
+ malformedLines: input.signalLogStats?.malformedLines ?? 0,
907
+ // доля событий-дубликатов среди всех событий с event_id (v1-записи без id не учитываются)
908
+ duplicateEventRatePct: seenEventIds.size + duplicateLines > 0 ? (duplicateLines / (seenEventIds.size + duplicateLines)) * 100 : null,
909
+ unknownModelRatePct: runSignals.length > 0 ? (unknownModels / runSignals.length) * 100 : null,
910
+ pricingCoveragePct: input.pricing === undefined || runsWithTokens.length === 0 ? null : (pricedRuns / runsWithTokens.length) * 100,
911
+ completeTraceRatePct: null,
912
+ completeTraceRateReason: 'span model planned P2',
913
+ };
727
914
  return {
728
915
  generatedAt: now.toISOString(),
729
916
  thresholds,
@@ -736,6 +923,7 @@ export async function buildAnalyticsReport(deps, input) {
736
923
  steward,
737
924
  readiness,
738
925
  councils,
926
+ coordination,
739
927
  acceptance: { accepted: acceptance.accepted, costPerAcceptedTask: acceptance.costPerAcceptedTask },
740
928
  coverage,
741
929
  dataQuality,
@@ -751,7 +939,13 @@ export function filterAnalytics(report, filter) {
751
939
  rows = rows.filter((r) => r.lifecycle === filter.class);
752
940
  if (filter.type !== undefined)
753
941
  rows = rows.filter((r) => r.type === filter.type);
754
- return { view: 'memory', rows: rows.slice(0, top), garbage: report.memory.garbage };
942
+ return {
943
+ view: 'memory',
944
+ rows: rows.slice(0, top),
945
+ garbage: report.memory.garbage,
946
+ funnel: report.memory.funnel,
947
+ attribution: report.memory.attribution,
948
+ };
755
949
  }
756
950
  case 'tools': {
757
951
  let rows = report.tools;
@@ -781,6 +975,8 @@ export function filterAnalytics(report, filter) {
781
975
  return { view: 'readiness', readiness: report.readiness };
782
976
  case 'councils':
783
977
  return { view: 'councils', councils: report.councils };
978
+ case 'coordination':
979
+ return { view: 'coordination', coordination: report.coordination };
784
980
  case 'all':
785
981
  return { view: 'all', report };
786
982
  }